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,

Другие вопросы по тегам