Crond deslocamento de cinco minutos

21

É possível compensar um conjunto de scripts cron 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 a partir dele. Ambos os scripts precisam ser executados a cada 5 minutos. Eu quero compensar o script 2 por um minuto para que ele possa criar um relatório a partir dos novos dados. POR EXEMPLO. Quero que o script um seja executado em :00, :05, :10, :15 [...] e o script dois seja executado em :01, :06, :11, :16 [...] a cada hora. Os scripts não dependem uns dos outros 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 últimos dados. Isso é possível com o cron?

Post;
Pensei em usar os dois comandos em um script de shell para que eles sejam executados imediatamente após o outro, mas isso não funcionaria. Às vezes, o script 1 pode ficar pendurado na espera de APIs externas, etc., pode levar até 15 minutos para ser executado, mas o script 2 deve ser executado a cada 5 minutos, portanto, fazer isso interromper / atrasar a execução do script 2. Se eu pudesse definir isso no Cron, isso significaria que o script 2 seria executado independentemente do que o script 1 estivesse fazendo

    
por Smudge 02.07.2011 / 16:27

3 respostas

13

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

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

Mas isso é apenas uma abreviação para:

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

Se você quiser executar o script 2 um minuto após o script 1, poderá fazer isso:

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, no início do roteiro 2, durma por um minuto:

sleep 60
    
por 02.07.2011 / 16:37
39

O campo de entrada de minutos para o crontab aceita um operador de "incrementos de" que é um pouco confuso porque parece que deve ser um operador matemático "dividir por", mas não é. Na maioria das vezes, você verá algo como o seguinte. Observe que isso não encontra números que são divisíveis por cinco, mas toma cada quinto item de um conjunto:

 */5 * * * * command

Isso diz ao cron para corresponder a cada quinto item ( /5 ) do conjunto de minutos 0-59 ( * ), mas você pode alterar o conjunto assim:

 1-59/5 * * * * command

Isso levaria cada quinto item do set 1-59, executando o seu comando nos minutos 6, 11, 16, etc.

Se você precisar de compensações mais finas do que um minuto, você pode cortá-lo usando o comando sleep como parte do seu crontab assim:

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

Isso executaria seu trabalho a cada cinco minutos, mas o comando não começaria realmente até 15 segundos após o minuto. Para trabalhos de curta duração, em que alguns segundos depois de fazer alguma outra coisa faz toda a diferença, mas você não quer estar um minuto atrasado, isso é um truque bastante simples.

    
por 18.09.2012 / 11:36
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
    
por 14.12.2012 / 02:34