Crontab没有默默地为一个任务,但不能通过运行相同的命令重现

我有一个运行djangopipe理命令清除我的邮件队列的cron作业。 事实certificate,这不是发送,并有数千名客户没有收到电子邮件。

任何想法发生了什么?

我在我的crontab中有这样的一行(在过去3年以上也是这样)。

* * * * * /srv/grove_project/bin/cron.bash send_mail 

当我用相同的用户手动运行它的时候就起作用了。

 /srv/grove_project/bin/cron.bash send_mail 

/var/log/syslog

 Sep 20 10:10:01 ~ CMD (/srv/grove_project/bin/cron.bash process_fulfillment_postback > /dev/null 2>&1) Sep 20 10:10:01 ~ CMD (/srv/grove_project/bin/cron.bash send_mail ) Sep 20 10:10:01 ~ CMD (/srv/grove_project/bin/cron.bash monitor > /dev/null 2>&1) 

其他命令工作正常。

是什么赋予了?


更新

更多信息:命令的输出是:

 /srv/grove_project/env/lib/python2.6/site-packages/django/conf/__init__.py:75: DeprecationWarning: The ADMIN_MEDIA_PREFIX setting has been removed; use STATIC_URL instead. "use STATIC_URL instead.", DeprecationWarning) INFO 2012-09-20 12:34:02,210 root 31267 ------------------------------------------------------------------------ 

这是吐出的function:

  logging.info("-" * 72) #<--- this line printed # if PAUSE_SEND is turned on don't do anything. if not PAUSE_SEND: send_all() else: logging.info("sending is paused, quitting.") 

我没有看到“正在发送暂停”消息,所以看着send_all函数

 lock = FileLock("send_mail") logging.debug("acquiring lock...") #<-- I don't see this line 

由于我没有看到获取locking消息,它必须默默挂在FileLock只为crontab?

将输出发送到日志文件。 而不是这个:

 * * * * * /srv/grove_project/bin/cron.bash send_mail 

做这个:

 * * * * * /srv/grove_project/bin/cron.bash send_mail > /tmp/cron.bash 2>&1 

该命令的任何错误应该在/tmp/cron.bash中。 这是什么告诉你?

作为一个最佳实践,将STDOUT和STDERR从cronjob发送到某个地方总是一个好主意。 该cronjob可能会将电子邮件发送到某个电子邮件地址(如“root”)。 我确信收到root用户的电子邮件的人不理解它。

就我个人而言,我喜欢使用/ usr / bin / logger将我的cronjob输出发送到syslog 。 如果出现问题,只需检查/var/log/messages

追加这个> /tmp/send_mail.log 2>&1到你的cron的结尾,然后等待它再次失败,并看看send_mail.log看看会发生什么。


调用脚本自己和crontab之间的环境有什么区别?

Cron在非常小的环境下运行。

您可以将您当前的envredirect到一个文件:

 env > ~/env.full 

然后在这个环境下运行你的工作:

* * * * * env - $(/bin/cat /home/yuji/env.full) /srv/grove_project/bin/cron.bash send_mail > /tmp/send_mail.log 2>&1