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

5 投票
1 回答
4215 浏览
提问于 2025-04-16 18:58

我有一个用Python写的应用程序,它使用getopt()来解析命令行参数。在交互式的bash终端或者从命令行调用的bash脚本中运行都没问题,但当我通过cron从bash脚本中调用时,它就无法执行了。我使用的是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。

任何帮助都将不胜感激!

1 个回答

4

我同意这两个评论的观点,调试 crontab 任务的问题有一个方法就是确保你能看到所有的错误信息。你有没有查看过 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 是可以工作的。

希望这对你有帮助。

撰写回答