克伦作业失败了

我有一个python脚本,我想通过crontab运行。 我的crontab看起来像这样:

5,20,35,50 * * * * /var/www/django-apps/callreport/util.py 

该脚本设置为parsing一堆平面文件,并将信息粘贴到MySQL数据库,然后删除文件。 它从命令行运行良好,数据被复制到数据库,平面文件被删除。 但是设置为cron作业运行时没有任何反应。

过去,当一个cron作业失败时,我会收到一封邮件,但是我没有收到任何反馈,而且我仍然通过在这个盒子上做系统pipe理员来感觉我的方式。 我究竟做错了什么?

“cron”工作的常见问题是他们的环境为零,而不像在“at”工作中那样复制你的环境。 当某些东西是从命令行而不是从“cron”发出时,我的经验是“环境”是最常见的问题之一。 偶尔会遇到另外一个问题 – 'cron'作业不能和terminal一起运行,有时候程序会变得非常麻烦。 但是,这个比例是1%,而环境问题则是99%。

我使用的另一个关键技术是始终从'cron'运行一个shell脚本; shell脚本确保环境设置正确,然后运行真正的程序。 如果一个'cron'工作给我带来麻烦,我可以调整脚本来做这样的事情:

 { date env | sort set -x ...what was there before adding the debug... } >/tmp/cron.jobname.$$ 2>&1 

这将所有输出 – 标准输出和标准错误 – redirect到一个文件名。 如果您更喜欢进程ID,则可以将时间戳记构build到文件名中。 分析日志文件通常会迅速发现问题。

首先,检查一下crond是否正在运行。

当在命令行上工作的cronjob无法正常运行时,对我来说通常是一个环境问题 – 请记住,cronjob不会作为交互式shell运行。

从命令行运行env(1)并将其复制到某处。 接下来,修改你的cronjob来运行env,这样你可以比较这些值。 克朗应该通过电子邮件发送给你(你之前说过); HD提到了如何configuration这个。

 5,20,35,50 * * * * env; /var/www/django-apps/callreport/util.py 

这些是解决您的问题的一些想法:

  • 检查您的系统日志以查看cron守护进程是否实际启动脚本
  • 如果您的作业没有被logging,请尝试增加日志logging级别,以便让cronlogging每个作业的开始(请参见man cron )。 例如,如果您正在运行Vixie cron守护程序,则可以通过指定-L 1选项(或-L 2如果您还想检查作业完成时)来完成。
  • 从你的Python脚本开始,在/ tmp目录下创build一个空文件(这是另一种帮助你validation脚本被cron调用的方法,它的启动没有问题)

whereis python

输出应该是…

在/ usr / bin中/python

然后在脚本之前的Python的完整path。

5,20,35,50 * * * * / usr / bin / python /var/www/django-apps/callreport/util.py

我认为你可以将命令的输出redirect到一个文件,看看它为什么失败,像

 /var/www/django-apps/callreport/util.py > /tmp/util_log.txt 

我所见过的大多数情况都是由于脚本无法执行,而不是脚本本身的问题

你可以把这行放在crontab的顶部:

 MAILTO="[email protected]" 

从cron接收邮件。 也可以将输出redirect到临时失败,因为Dinesh Manne说要检查你的命令发生了什么。 只是问:你确定你正在使用运行命令的用户和你正在编辑的crontab的所有者是一样的吗?

请确保您的crond在文件名中使用点来运行脚本…!

另外 – validation你的用户不在cron.deny文件中。 如果你只想让cron运行某些人,添加你的用户到cron.allow

强制它崩溃。 把一些错误,而不是#!/ usr / bin / python,并validation是否通过电子邮件得到一个错误报告 – 你应该设置MAILTOvariables为您的电子邮件地址。 但如果从命令行运行脚本,请检查脚本是否真的失败。 如果仍然没有收到电子邮件错误,请validation是否有一些电子邮件在本地邮件队列( mailq )中被删除。 也许这将有助于找出沉默的失败。

另外,这个脚本依赖于什么内部系统? DNS,ldap / nis? 它是否有任何硬编码的IP地址或主机名不再存在(即MySQL主机)? 你可以关联最后一次成功运行和最后一次对脚本进行的更改吗? 有人做了一个隐形升级到您的机器上的Python? 你有足够的磁盘空间和indoes(df -i)吗?

你的crontab文件末尾是否有空行? 如果你强制脚本以root身份运行(坏的,只能用于testing)是否有效?

你有一个用户的crontab中的这个工作(你可以看到它与crontab -l ?),或者它在系统crontab( /etc/crontab )? 系统crontab(至less在Linux上,不知道其他系统)需要额外的用户参数,用户crontabs不需要。

在用户特定的crontab中,它应该是这样的:

 # crontab -l ... 5,20,35,50 * * * * /var/www/django-apps/callreport/util.py 

而系统crontab中的相同命令应该如下所示:

 # cat /etc/crontab ... 5,20,35,50 * * * * www-data /var/www/django-apps/callreport/util.py 

用户可能会在你的系统上有所不同,但这是一般的想法。

这听起来像你已经检查,但仔细检查脚本正在作为正确的用户运行。 当我解决cron作业问题时,我喜欢使用say命令(在我的mac上)使用系统调用,这样我util.py听到我感兴趣的参数。所以我可能会在util.py添加以下内容:

 import os os.system('whoami') 

除此之外,我会把钱放在许可问题上。 你的cron工作可能无法做你所要求的事情,因为权限并没有让它。