Я задаю этот вопрос, потому что не нашел здесь ответа:
Почему мой 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 работающих.
Вопрос
У кого-нибудь есть подсказка, где искать?
Прежде всего, на всякий случай, я бы посоветовал использовать правильные формы работы с crontab
. А именно
crontab -u user -r
чтобы удалить его crontab, и
crontab -u user backed_up_crontab_file
восстановить.
Во-вторых, ваше время может быть важным. Если crontab пользователя запускается редко, возможно, он пропустит запуск 1 раз после восстановления, потому что он сработал бы за минуту до фактического восстановления.