скрипт ведет себя по-разному через cron - PullRequest
0 голосов
/ 24 ноября 2011

Редактировать: Обновлено, чтобы отразить некоторые ответы

У меня на домашнем компьютере есть скрипт test.sh:

Примечание: $ USER = john

#!/bin/bash 
/usr/bin/scp -q john@mysite.com:/home/$USER/tmp/$USER /home/$USER/tmp/ > /dev/null 2>&1
error_code="$?"

if [ "$error_code" != "0" ]; then    #if file NOT present on mysite then:
        echo "File does not exist."
        exit
fi
echo "File exists."

Теперь допустим, я создал файл на сервере mysite.com примерно так:

echo > tmp/$USER

Теперь, когда я запускаю вышеописанный скрипт на моем рабочем столе вручную, вот так:

./test.sh

Я получаю результат "Файл существует".

Но если я запускаю его через crontab, я получаю результат "Файл не существует" Мой crontab выглядит так:

* * * * * /home/user/test.sh >> /home/user/test.log 2>&1

Я провел весь день, пытаясь проверить логику и все остальное ... Кажется, я не могу понять, почему это так. Заранее всем спасибо за помощь:)

Редактировать : scp выглядит на mysite.com:/home/$USER/tmp/ dir $ USER на моем рабочем столе и сервере одинаковы. Так что я не думаю, что это проблема относительности. Если бы я был

ssh $USER@mysite.com 

, а затем сделать

ls tmp/

Я посмотрю файл там.

Кроме того, запись в crontab находится в моем crontab, а не в crontab другого пользователя или root.

@ Джонатан: Я установил аутентификацию на основе ключей. Пароль не требуется!

@ netcoder: В моем файле журнала я вижу повторяющиеся строки «Файл не существует».

@ sarnold: в моей строке scp я добавил john@mysite.com, просто чтобы убедиться, что cron использует учетную запись john на mysite.com, когда crond запускает скрипт. Тем не менее, тот же результат.

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Возможно, проблема в том, что ваша переменная окружения $USER не установлена ​​при запуске под cron.

Вы можете попробовать добавить что-то подобное в ваш скрипт:

echo "User: $USER" > /tmp/crontest.log

ПослеЗаставив cron запустить скрипт, посмотрите, что находится в /tmp/crontest.log

Если ничего не установлено, вы можете попробовать что-то вроде этого: Где я могу установить переменные окружения, которые crontabбудете использовать?

1 голос
/ 24 ноября 2011

Я ожидаю, что проблема здесь: mysite.com:tmp/$USER - tmp/ - это относительный путь относительно текущего рабочего каталога. Когда ваш код выполняется с помощью crond(8), ваш cwd может отличаться от того, когда вы выполняете его вручную.

Как указывает @ netcoder в своем комментарии , абсолютные пути являются лучшим способом работы со скриптами / программами, выполняемыми из crontab(5) файлов.

...