Как передать параметр bash скрипту python в задании cron?

#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 .

Я