Crontab молча завершается с ошибкой для одной задачи, но не может воспроизвести, выполнив ту же команду
У меня есть задание 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?
2 ответа
Добавить это > /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
Отправить вывод ошибки в лог-файл. Вместо этого:
* * * * * /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, не ценит это.
Лично мне нравится отправлять вывод cronjob в системный журнал, используя / usr / bin / logger. Если есть проблема, просто проверьте /var/log/messages
,