我有一个python应用程序,它使用getopt()来解析参数的命令行。它在交互式bash shell中工作,或者在从命令行调用的bash脚本中工作正常,当通过cron从bash shell脚本中调用时,它不会执行。我正在使用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脚本运行正常。但是当我尝试通过cron运行bash脚本时,执行失败并出现上述错误。
我无法确定shell脚本无法通过cron正确执行的原因。我在用于cron作业的bash脚本中使用完整路径名,因此环境路径应该不是问题:
/usr/bin/python /path/to/myscript.py -i /path/to/input.txt --log --timer
我认为这个语法在通过cron调用的bash脚本中使用时,可能会将脚本的参数传递给python,而不是传递给myscript.py。
任何帮助将不胜感激!
答案 0 :(得分:4)
虽然我同意这两条评论,但调试crontab条目问题的一种方法是确保收到所有错误消息。你在看cron用户的电子邮件文件吗?来自cron的任何未捕获输出都将作为电子邮件发送到userID。 (如果用户在cron'ed机器上没有电子邮件帐户,则这是一个单独的问题。)
无论如何,我发现明确捕获输出很有帮助。如果我没有得到输出文件(至少是零大小的文件),那么我知道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,所以你在命令行中包含的任何变量分配都更好,如{{1} }
我从来没有机会从crontab“获取”环境变量文件,但我希望它可以与69 13 05 06 * { var=1 ; export var ; cmds ... ; } ...
一起使用。
IHTH