如何在cron作业中将bash参数传递给Python脚本?

5

我有一个使用 getopt() 解析命令行参数的 Python 应用程序。在交互式 bash shell 或从命令行调用的 bash 脚本中都正常工作,但是当通过 cron 在 bash shell 脚本内调用时将无法执行。我正在使用 Fedora 15。

当作为 cron 作业调用时,应用程序会失败,并在 /var/log/messages 中发出以下错误:

myscript.py:abrt:在 myscript.py 中检测到未处理的 Python 异常

看起来命令行参数没有正确地传递给 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。
如有帮助,不胜感激!

3
当人们在cron(8)中运行脚本和程序时遇到问题时,错误更常来自于缺失环境变量。因此我并不认为这是参数解析的问题。尝试找出有关未处理的异常的更多详细信息:将整个脚本用try/catch块包装起来,并将异常的详细信息保存到磁盘上。 - sarnold
1
尝试通过shell执行Python,例如/bin/bash -c "/path/to/python /path/to/script ..."。这可能有所帮助,但只是猜测-我之前遇到类似的问题,直到意识到cron使用/bin/sh来执行它的命令。 - cji
1个回答

4
虽然我同意两位评论者的观点,但是调试crontab条目的一种方法是确保您获取了所有错误消息。您是否查看cron用户的电子邮件文件?来自cron的任何未捕获输出都会作为电子邮件发送到userID。(如果用户在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 中“source”环境变量文件的情况,但我认为可以通过 . /path/to/envFile 实现。

IHTH


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接