我有一个运行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