#python #bash #parameters #cron
#python #bash #параметры #cron
Вопрос:
У меня есть приложение на python, которое использует getopt() для анализа параметров командной строки. Он отлично работает в интерактивной оболочке bash или в скрипте bash, который вызывается из командной строки, но он не будет выполняться при вызове из скрипта оболочки bash через cron. Я использую Fedora 15.
Приложение завершается с ошибкой при вызове в качестве задания cron, выдавая следующую ошибку в /var /log / messages:
myscript.py: abrt: detected unhandled Python exception in myscript.py
Похоже, что параметры командной строки не передаются скрипту Python должным образом.
Например, следующий вызов командной строки работает должным образом, устанавливая входное имя файла в «input.txt » и установив флаги «log» и «timer» на их желаемые значения:
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. Когда у людей возникают проблемы с запуском скриптов и программ изнутри
cron(8)
, ошибки чаще всего возникают из-за отсутствия переменных среды. Итак, я не уверен, что это синтаксический анализ параметров. Попробуйте выяснить больше деталей об этом необработанном исключении: оберните весь ваш скрипт с помощьюtry
/catch
block и сохраните сведения об исключении на диске.2. Попробуйте выполнить python через shell, что-то вроде
/bin/bash -c "/path/to/python /path/to/script ..."
. Это могло бы помочь, но это всего лишь предположение — у меня была похожая проблема, пока я не понял, что cron использует /bin / sh для выполнения своих команд.
Ответ №1:
Хотя я согласен с обоими комментариями, один из способов устранения проблем с записями 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>amp;1
Напомним (согласно напоминанию @cji), что cron будет использовать /bin/sh (который в системах в любом случае может оказаться bash, поэтому любые переменные, которые вы включаете в командную строку, лучше выполнять следующим образом 69 13 05 06 * { var=1 ; export var ; cmds ... ; } ...
У меня никогда не было возможности использовать «исходный код» файла переменных среды из crontab, но я ожидал бы, что он будет работать с . /path/to/envFile
.
Я