Crond offset programação de cinco minutos

22

É possível compensar um script cron definido para ser executado a cada 5 minutos?

Eu tenho dois scripts, o script 1 coleta alguns dados de um banco de dados e os insere em outro, o script 2 extrai esses dados e muitos outros dados e cria alguns relatórios bonitos. Ambos os scripts precisam ser executados a cada 5 minutos. Desejo compensar o script 2 por um minuto para que ele possa criar um relatório a partir dos novos dados. Por exemplo, eu quero que o script um seja executado :00, :05, :10, :15 [...]e o script dois seja executado a :01, :06, :11, :16 [...]cada hora. Os scripts não são dependentes um do outro e o script 2 deve ser executado independentemente de o script um ter êxito ou não. Mas seria útil se os relatórios pudessem ter os dados mais recentes. Isso é possível com o cron?

Postar;
Eu pensei em usar os dois comandos em um script de shell para que eles sejam executados imediatamente um após o outro, mas isso não funcionaria; às vezes, o script 1 pode ficar parado ao aguardar APIs externas etc. o script 2 deve ser executado a cada 5 minutos, dessa forma, interrompe / atrasa a execução do script 2. Se eu pudesse definir isso em Cron, isso significaria que o script 2 seria executado independentemente do script 1

mancha
fonte

Respostas:

14

Você pode executar scripts sempre que quiser usar cron. Se você deseja executar o script 1 a cada 5 minutos, pode começar assim:

*/5 * * * * /path/to/script1

Mas isso é realmente apenas uma abreviação para:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/script1

Se você deseja executar o script 2 um minuto após o script 1, pode fazer o seguinte:

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /path/to/script2

Você também pode fazer isso:

*/5 * * * * /path/to/script1
*/5 * * * * /path/to/script2

E então, no início do script 2, durma por um minuto:

sleep 60
larsks
fonte
4
Colocar o sono no script em si é um truque feio que torna difícil a execução do script manualmente, a partir do prompt. Há uma maneira menos feia de hackear isso , tornando a suspensão parte da entrada do crontab, mas uma maneira ainda mais elegante é simplesmente compensar os trabalhos usando a notação correta do crontab, na qual sua resposta não toca.
Caleb
39

O campo de entrada de minuto do crontab aceita um operador "incrementos de" que é meio confuso, porque parece que deve ser um operador "dividido por" matemático, mas não é. Você verá com mais frequência algo como o seguinte. Observe que isso não localiza números que são divisíveis por cinco, mas retira cada quinto item de um conjunto:

 */5 * * * * command

Isso instrui o cron a corresponder a cada quinto item ( /5) do conjunto de minutos de 0 a 59 ( *), mas você pode alterar o conjunto da seguinte maneira:

 1-59/5 * * * * command

Isso levaria cada quinto item do conjunto de 1 a 59, executando seu comando nos minutos 6, 11, 16 etc.

Se você precisar de mais compensações de granulação fina do que um minuto, poderá cortá-lo usando o comando sleep como parte do seu crontab, desta forma:

 */5 * * * * sleep 15 && command

Isso executaria seu trabalho a cada cinco minutos, mas o comando não seria iniciado até 15 segundos após o minuto. Para tarefas de execução curta, onde ficar alguns segundos depois de outra coisa faz toda a diferença, mas você não quer chegar um minuto inteiro atrasado, esse é um truque bastante simples.

Caleb
fonte
1
Esta é uma resposta melhor que a aceita. Definir o deslocamento através da faixa é muito mais limpo do que dormir.
ND Geek
11

Você pode indicar um deslocamento de tempo com o símbolo +. Por exemplo, para executar em :01, :06, :11, :16 [...], crie uma tarefa como

*/5+1 * * * * command
Kurt
fonte
7
Isso não parece funcionar em algumas versões do cron
jhoff
1
Qual versão do cron você está usando que suporta esta sintaxe? Cronie não parece apoiá-lo.
Matthew G
Eu tenho o Cronie no CentOS7, então não vou tentar esta solução primeiro.
AnneTheAgile
1

Isso funcionou para mim:

1/5 * ? * * *

Onde 1 são os minutos de deslocamento. Então, se você deseja compensar três minutos:

3/5 * ? * * *

Eu tenho isso funcionando nas configurações de agendamento da AWS

Zymotik
fonte