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

иногда 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 работающих.

Вопрос

У кого-нибудь есть подсказка, где искать?

Прежде всего, на всякий случай, я бы посоветовал использовать правильные формы работы с crontab. А именно

crontab -u user -r

чтобы удалить его crontab, и

crontab -u user backed_up_crontab_file

восстановить.

Во-вторых, ваше время может быть важным. Если crontab пользователя запускается редко, возможно, он пропустит запуск 1 раз после восстановления, потому что он сработал бы за минуту до фактического восстановления.