Как передать параметр bash скрипту python в задании cron? - PullRequest
5 голосов
/ 05 июня 2011

У меня есть приложение на python, которое использует getopt () для анализа параметров командной строки.Он отлично работает в интерактивной оболочке bash или в скрипте bash, который вызывается из командной строки, но он не будет выполняться при вызове из скрипта оболочки bash через cron.Я использую Fedora 15.

Приложение не запускается, когда вызывается как задание cron, и в / var / log / messages выдается следующая ошибка:

myscript.py: abrt: detected unhandled Python exception in myscript.py

ItПохоже, что параметры командной строки не передаются в скрипт Python должным образом.

Например, следующий вызов командной строки работает правильно, устанавливая для входного имени файла «input.txt» и устанавливая «log»и «отметчик времени» указывает на их желаемые значения:

python myscript.py -i input.txt --log --timer

Когда я пытаюсь вызвать программу через скрипт bash из командной строки, скрипт bash работает нормально.Но когда я пытаюсь запустить bash-скрипт через cron, выполнение завершается неудачно с вышеупомянутой ошибкой.

Я затрудняюсь определить, почему скрипт оболочки не работает должным образом через cron.Я использую полные пути из скрипта bash, используемого для задания cron, поэтому пути к среде не должны быть проблемой:

/usr/bin/python /path/to/myscript.py -i /path/to/input.txt --log --timer

Я думаю, что этот синтаксис, когдаиспользуется в скрипте bash, вызываемом через cron, может передавать параметры скрипта в python, а не в myscript.py.

Любая помощь приветствуется!

1 Ответ

4 голосов
/ 05 июня 2011

Хотя я согласен с обоими комментариями, один из способов отладки проблем с записями crontab - убедиться, что вы получаете все сообщения об ошибках. Вы ищете файл электронной почты пользователей cron? Любой неперехваченный вывод cron отправляется как электронное письмо на имя пользователя. (Если у пользователя нет учетной записи электронной почты на компьютере cron, это отдельная проблема).

В любом случае, я считаю полезным явно зафиксировать вывод. Если я не получаю выходные файлы (по крайней мере, файлы нулевого размера), то я знаю, что crontab даже не запускался.

Вот пример записи crontab, настроенной на захват всех выходных данных.

59 13 05 06 * { /usr/bin/python /path/to/myscript.py -i /path/to/input.txt --log --timer ; } > /tmp/myProj/myscriptPY.trace.`/bin/date +\%Y\%m\%d.\%H\%M` 2>&1

Напомним (в соответствии с напоминанием @cji), что cron будет использовать / bin / sh (что в любом случае в системах может оказаться bash, поэтому любые переменные, которые вы включаете в командную строку, лучше выполнять как 69 13 05 06 * { var=1 ; export var ; cmds ... ; } ...

У меня никогда не было возможности 'получить' файл переменных окружения из crontab, но я ожидаю, что он будет работать с . /path/to/envFile.

IHTH

...