Quão preciso é um daemon cron?

22

O agendador de tarefas cron é realmente preciso?

Quero dizer, preciso de um script para executar todas as noites o mais recente possível, mas antes das 00:00 do dia seguinte.

Idealmente, eu executaria um trabalho cron às 23.59 (ou 23:59), mas o sistema será realmente preciso? Como um segundo importa, devo definir o trabalho cron como 23:58 para deixar algum tempo?

Sebastian
fonte
13
Por que você tem esses requisitos? Tenho a sensação de que haverá uma maneira melhor de fazer o que você realmente está tentando fazer, e você também pode perguntar sobre isso. (Vai demorar um esforço pouco mais do que apenas o agendamento de um trabalho cron, mas talvez não muito mais.)
David Z
Eu costumava usar um cron mudo antigo com uma precisão de 10 minutos.
joshudson
7
Sua exigência não me parece muito confiável. O que você faz se o seu sistema tiver alta carga por volta da meia-noite. A menos que você tenha um sistema RT, você não pode garantir nada.
Thomas Erker 9/09/15
Considere que, mesmo que você consiga adquirir um servidor que esteja sempre disponível e possa sempre concluir seu trabalho em menos de um segundo, ainda há coisas que podem dar errado. Por exemplo, seu relógio pode começar a flutuar sem você perceber. Isso é muito, muito frágil e eu concordo com os comentários acima que o sistema precisa mudar.
21815 Chris Hayes

Respostas:

24

O que o cron pode garantir é que seu trabalho seja iniciado antes da hora especificada (sujeito à precisão do relógio do sistema). Mas não há como garantir o tempo de término do trabalho. Vai depender de muitos fatores:

  • Quão carregado é o sistema
  • O que o trabalho faz
  • Lentidão devido a problemas de hardware
  • Lentidão devido a problemas de rede (assumindo que o trabalho depende da rede)

Minha recomendação é alterar seu design para que um tempo de conclusão específico não seja um requisito.

Kasperd
fonte
1
A maneira mais fácil de fazer isso é provavelmente fazer com que o trabalho iniciado pelo cron crie um arquivo para indicar que ele está sendo executado e excluído sempre que o trabalho sair (com ou sem êxito) e, em seguida, o próximo trabalho (supondo que esse seja o objetivo) aguarde até que o arquivo desapareça antes de fazer qualquer coisa.
a CVn
@ MichaelKjörling Você deve usar um diretório, em vez de um arquivo, como verificar um arquivo e criá-lo não é atômico .
8bittree
1
@ 8bittree, você também pode usar o rebanho, se disponível.
user9517 suporta GoFundMonica
1
@ MichaelKjörling Mas por que se preocupar com o caso talvez bom, quando o caso correto também é mais simples?
8bittree
4
@ 8bittree Se utilizar O_CREATe O_EXCLsinalizar, será atómico desde que o ficheiro esteja num sistema de ficheiros local.
precisa saber é
14

Suponho que isso depende do seu daemon cron, mas a documentação e o padrão indicam que, se você especificar minutos, o trabalho será executado no minuto especificado.

Vejo:

Esteja ciente de que seu script será iniciado quando o relógio passar para a hora correta, mas terminará algum tempo depois disso.

Falcon Momot
fonte
Eu tenho um servidor virtual com carga muito baixa e, no entanto, um cron configurado para ser executado a cada minuto começará às vezes em 0s, 1s, 2s, às vezes até 17s. Meu palpite é que o cron pode ser menos preciso em um servidor virtual, pois outros processos fora desse servidor podem afetar a disponibilidade de recursos, como CPU.
Liam
8

Geralmente, o cron inicia às 23:59:00 , verifica todos os seus arquivos crontab, filtra aqueles que são relevantes para 23:59 e os inicia. A verificação desses arquivos é muito rápida, porque não existem muitos e todos incluem apenas algumas linhas. Geralmente, os cronjobs iniciam às 23:59:00 ou 23:59:01 Há maneiras de retardar intencionalmente esse processo. (adicione milhões de linhas ao crontab, por exemplo). Se o sistema estiver totalmente sobrecarregado, isso também não funcionará tão rápido.

Além disso, isso obviamente depende da implementação.

Se você precisar de horários de início muito exatos, é melhor criar um programa que dorme até o tempo que você deseja e depois execute (por exemplo, usando o c ++ 11 ). Mas em um sistema operacional não em tempo real, isso também não será exato! Além disso, o relógio do PC não sabe a hora exata!

Em todos os casos, isso garante apenas que o programa inicie na (mais ou menos) hora que você deseja. Não pode haver garantia de que o programa termine com êxito até um determinado período, por isso acredito firmemente que você deve alterar algo nesse requisito.

Josef
fonte
2
Acredito que os crontabs estejam na memória - se você editar os arquivos atrás do crontab diretamente (em vez de crontab -e, que notifica o cron quando concluído), as alterações não terão efeito. O cron tem uma grande quantidade de tempo de inatividade para determinar quais trabalhos estão chegando, ele pode "dormir" até o exato segundo em que o trabalho deve ser executado.
AMADANON Inc.
0

Depende do tempo de execução geral do script e da precisão do tempo do servidor.

59 23 * * * /some/script/file.sh

iniciará seu script exatamente às 23:59, mas, se você tiver alguns comandos que funcionem por muito tempo, parte do script poderá ser executada após a meia-noite.

homem estranho
fonte
exatamente às 23:59 , para que seja de 23:59:00 a 23:59:59?
AL
2
Você não tem segundos no cron normal. Para obter esses 59 segundos extras, você deve adicionar uma 'espera (59)' na parte superior do seu código.
Henry's Cat
4
@AL na prática, eu sempre o vi rodar em xx: xx: 00 ou xx: xx: 01, mas em um sistema muito carregado não há e não pode haver promessas.
hobbs