as vezes, o crontab não é recarregado pelo daemon do cron

4

Estou fazendo esta pergunta, porque não encontrei a resposta aqui:

Contexto

Temos vários servidores executando o debian / wheezy.

Uma tarefa de backup requer que nós desativemos o crontab de um usuário específico durante o backup, portanto, temos um script, executado diariamente, que é aproximadamente:

# 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

E isso funciona como esperamos, na grande maioria das vezes.

Esta tarefa é executada em ~ 80 servidores; dependendo do servidor, a tarefa de backup levará de 1 minuto a 2 horas.

Bug

De vez em quando, o cron não detectará o último recarregamento e não executará nenhuma das tarefas listadas no crontab.

O arquivo em /var/spool/cron/crontabs/legec tem o conteúdo esperado e a data de modificação:

$ ls -lh /var/spool/cron/crontabs/legec
-rw------- 1 legec crontab 6.7K Sep 22 04:03 /var/spool/cron/crontabs/legec

mas os registros cron indicam que o cron não detectou a última alteração:

$ 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

"De vez em quando" significa: sem regularidade, vemos este bug talvez uma vez por mês, em um servidor aleatório fora dos ~ 80 que estão sendo executados.

Pergunta

Alguém tem uma pista sobre onde procurar?

    
por LeGEC 22.09.2017 / 10:21

1 resposta

4

Antes de mais nada, só por precaução, aconselho usar formas adequadas de lidar com crontab . A saber

crontab -u user -r

para excluir seu crontab e

crontab -u user backed_up_crontab_file

para restaurar.

Em segundo lugar, seus horários podem ser importantes. Se o crontab do usuário for executado raramente, talvez ele perca a execução 1 vez após a restauração, porque ele teria sido disparado um minuto antes de ser realmente restaurado.

    
por 24.09.2017 / 13:25