Como manter o cron de stampeding?

12

Digamos que eu tenha vários scripts cron que precisam ser executados a cada 15 minutos. Eu poderia configurá-los para serem executados: */15 * * * * , mas todos eles são executados ao mesmo tempo. Parece bobo que o servidor fique inativo por vários minutos e, de repente, tente executar uma dúzia de scripts ao mesmo tempo.

Existe uma maneira de eu ter um script sendo executado no minuto 1, 16, 31, 46 e outro em 2, 17, 32, 47?

Em outras palavras, quero que cada script seja executado a cada 15 minutos, mas não me importo que eles sejam executados especificamente nas marcas de um quarto de hora.

    
por Buttons840 02.11.2011 / 19:12

6 respostas

7

Você está tornando isso mais difícil do que precisa ser. Coloque todos na mesma linha, separados por ponto e vírgula:

*/15 * * * * command1 ; command 2 ; command 3

Ele executará command1 , aguardará a conclusão, depois executará command2 , aguardará a conclusão e assim por diante.

    
por 11.11.2011 / 04:21
15

Se você fizer seu trabalho cron parecer assim: 6-59/15 * * * * , então ele será executado às 6, 21, 36 e 51 minutos depois da hora.

Isso pode não funcionar com todas as versões do cron.

    
por 02.11.2011 / 19:17
14

Você pode colocar todos os scripts em um diretório, digamos /etc/cron.15m , e depois executar o cron

*/15 * * * * run-parts /etc/cron.15m

Supondo que você tenha o comando run-parts . Está presente em todos os sistemas baseados no Debian, pelo menos. Ele executa todos os programas executáveis no diretório nomeado, um por vez na ordem de lista.

Uma desvantagem deste método é que se um dos scripts travar, todo o resto esperará e não será executado. Se o tempo de execução de todos eles for maior que 15 minutos, o job começará a ser executado novamente e você poderá obter muitos processos se acumulando.

    
por 02.11.2011 / 19:59
9

A maneira mais simples de fazer isso é apenas configurar manualmente os comandos para serem executados quando você quiser:

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14

Ou você pode escrever um script para gerar automaticamente as entradas apropriadas do crontab (que evitam erros de digitação).

Algumas versões do cron (provavelmente incluindo a que você está usando) aceitam uma sintaxe estendida:

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14
    
por 02.11.2011 / 20:46
0

Cron não é muito bom no que você está tentando fazer. Você já pensou em escrever um script que age como um daemon que basicamente dorme 15 minutos, executa o comando e, em seguida, faz um loop?

    
por 02.11.2011 / 20:03
0

Muitas distribuições têm o /etc/cron.d/cronhourly, para o qual todos os scripts são executados a cada hora. Você pode até mesmo especificar a ordem, iniciando-os com números sequenciais, lik 01scriptA 02scriptB - deve ser trivial com o cron conhecimento que você já tem que fabricar um "cronhourlybyfour" como nós o chamamos na linux distro base do Smoothwall:)

Palavra de aviso: isso usa partes de execução como sugerido anteriormente, e partes de execução NÃO gostam de scripts com um. no nome, por isso não o chame de "deletehomefolders.sh", chame-o de "01deletehomefolders" e certifique-se de começar com o # certo! linha para o que você pretende interpretar o seu roteiro.

    
por 10.11.2011 / 22:56

Tags