我有一个想通过 crontab 运行的 Python 脚本。我的 crontab 如下所示:
5,20,35,50 * * * * /var/www/django-apps/callreport/util.py
该脚本被设置为解析一堆平面文件并将信息粘贴到 MySQL 数据库中,然后删除这些文件。它可以从命令行正常运行,数据被复制到数据库中,平面文件被删除。但是当设置为作为 cron 作业运行时,什么也不会发生。
过去,当 cron 作业失败时,我会收到一封邮件,但这次我没有收到任何反馈,而且我仍然在尝试以系统管理员的身份来操作这台机器。我做错了什么?
答案1
“cron”作业的常见问题是它们没有环境 - 不像“at”作业那样会复制您的环境。当某些东西从命令行而不是“cron”工作时,我的经验是“环境”是最常见的问题之一。偶尔你会遇到另一个问题 - “cron”作业不是通过终端运行的,偶尔程序会对此感到不安。然而,这在 1% 的范围内,而环境问题则高达 99%。
我使用的另一个关键技术是始终从“cron”运行 shell 脚本;shell 脚本确保环境是正确设置,然后运行实际程序。如果“cron”作业给我带来问题,我可以调整脚本来执行以下有用的操作:
{
date
env | sort
set -x
...what was there before adding the debug...
} >/tmp/cron.jobname.$$ 2>&1
这会将所有输出(标准输出和标准错误)重定向到文件名。如果您喜欢将时间戳嵌入到文件名中,而不是进程 ID,则可以这样做。分析日志文件通常可以快速发现问题。
答案2
首先,检查 crond 是否正在运行。
当在命令行上运行的 cronjobs 无法按预期运行时,对我来说这通常是环境问题——请记住 cronjob 不会作为交互式 shell 运行。
从命令行运行 env(1) 并将这些复制到某个地方。接下来,修改 cronjob 以运行 env,以便您可以比较这些值。Cron应该通过电子邮件向您发送输出(您之前说过);HD 提到了如何配置它。
5,20,35,50 * * * * env; /var/www/django-apps/callreport/util.py
答案3
以下是一些解决问题的方法:
- 检查系统日志,查看 cron 守护程序是否确实启动了该脚本
- 如果您的作业没有被记录,请尝试增加日志级别,以便记录
cron
每个作业的开始(请参阅man cron
)。例如,如果您正在运行 Vixie cron 守护程序,则可以通过指定选项来完成此-L 1
操作(或者-L 2
如果您还想检查作业何时完成)。 - 从您的 Python 脚本开始,立即在 /tmp 目录上创建一个空文件(这是另一种帮助您验证该脚本是否由 cron 调用并且启动没有问题的方法)
答案4
我认为你可以将命令的输出重定向到一个文件来查看它失败的原因,例如
/var/www/django-apps/callreport/util.py > /tmp/util_log.txt
我见过的大多数静默失败的情况都是因为脚本无法执行,而不是脚本本身的问题