我有一个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
这些是解决您的问题的一些想法:
cronlogging每个作业的开始(请参见man cron )。 例如,如果您正在运行Vixie cron守护程序,则可以通过指定-L 1选项(或-L 2如果您还想检查作业完成时)来完成。 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工作可能无法做你所要求的事情,因为权限并没有让它。