Назад | Перейти на главную страницу

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?

Отправить сообщение об ошибке в файл журнала. Вместо этого:

* * * * * /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