Иногда crontab не перезагружается демоном cron
Я задаю этот вопрос, потому что я не мог найти ответ здесь:
Почему мой crontab не работает, и как я могу устранить его?
контекст
У нас есть несколько серверов под управлением Debian/ Wheezy.
Одна задача резервного копирования требует, чтобы мы деактивировали crontab определенного пользователя во время резервного копирования, поэтому у нас есть скрипт, запускаемый ежедневно, который примерно выполняет:
# user is legec :
# save the crontab to a file
crontab -ulegec -l > /home/legec/.backup/crontab
# empty the crontab
echo "" | crontab -ulegec
backup ...
# reload crontab
cat /home/legec/.backup/crontab | crontab -ulegec
И это работает, как мы ожидаем, в подавляющем большинстве случаев.
Эта задача выполняется на ~80 серверах; в зависимости от сервера задание резервного копирования займет от 1 минуты до 2 часов.
ошибка
Время от времени cron не обнаруживает последнюю перезагрузку и не выполняет ни одно из заданий, перечисленных в crontab.
Файл в /var/spool/cron/crontabs/legec
имеет ожидаемое содержание и дату изменения:
$ ls -lh /var/spool/cron/crontabs/legec
-rw------- 1 legec crontab 6.7K Sep 22 04:03 /var/spool/cron/crontabs/legec
но журналы cron показывают, что cron не обнаружил последнее изменение:
$ cat /var/log/cron.log | grep -E "LIST|RELOAD|REPLACE"
...
# yesterday's backup : all went fine
Sep 21 04:00:06 lgserver crontab[6670]: (root) LIST (legec)
Sep 21 04:00:06 lgserver crontab[6671]: (root) LIST (legec)
Sep 21 04:00:06 lgserver crontab[6673]: (root) REPLACE (legec)
Sep 21 04:01:01 lgserver /usr/sbin/cron[2025]: (legec) RELOAD (crontabs/legec)
Sep 21 04:03:01 lgserver crontab[7071]: (root) REPLACE (legec)
Sep 21 04:03:01 lgserver /usr/sbin/cron[2025]: (legec) RELOAD (crontabs/legec)
# today's backup : no final RELOAD event
Sep 22 04:00:07 lgserver crontab[24163]: (root) LIST (legec)
Sep 22 04:00:07 lgserver crontab[24164]: (root) LIST (legec)
Sep 22 04:00:07 lgserver crontab[24166]: (root) REPLACE (legec)
Sep 22 04:01:01 lgserver /usr/sbin/cron[2025]: (legec) RELOAD (crontabs/legec)
Sep 22 04:03:01 lgserver crontab[24458]: (root) REPLACE (legec)
# no RELOAD line here
"Время от времени" означает: нет регулярности, мы видим эту ошибку, возможно, раз в месяц, на одном случайном сервере из ~80, которые работают.
Вопрос
У кого-нибудь есть подсказка, где искать?
1 ответ
Прежде всего, просто чтобы быть в безопасности, я бы посоветовал использовать правильные формы борьбы с crontab
, а именно
crontab -u user -r
удалить его crontab, и
crontab -u user backed_up_crontab_file
восстановить.
Во-вторых, ваши сроки могут быть важны. Если crontab пользователя запускается редко, возможно, он пропустил 1 раз после восстановления, потому что он бы сработал за минуту до того, как он был фактически восстановлен.