У меня есть задание cron, которое запускает команду управления django, которая очищает мою очередь почты. Оказалось, что это не отправка, и несколько тысяч клиентов не получили электронные письма.
Есть идеи, что здесь происходит?
У меня есть эта строка в моем 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 ------------------------------------------------------------------------
Вот функция, которая это выплевывает:
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
Поскольку я не вижу сообщения о блокировке получения данных, оно должно молча висеть 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 из задания cron куда-нибудь. Эта cronjob может отправлять электронную почту на какой-то адрес электронной почты (например, root). Я уверен, что человек, получающий электронную почту root, этого не оценит.
Лично мне нравится отправка моего вывода cronjob в syslog с помощью / usr / bin / logger. Если есть проблема, просто проверьте /var/log/messages
.
Добавить это > /tmp/send_mail.log 2>&1
до конца вашего cron, затем подождите, пока он снова не сработает, и посмотрите на send_mail.log
чтобы увидеть, что происходит.
В чем разница в среде между вызовом скрипта самостоятельно и crontab?
Cron работает в очень минимальной среде.
Вы можете перенаправить текущий env в файл:
env > ~/env.full
затем запустите свою работу в этой среде:
* * * * * env - $(/bin/cat /home/yuji/env.full) /srv/grove_project/bin/cron.bash send_mail > /tmp/send_mail.log 2>&1