Trabalho Cron, início aleatório, mas dentro do prazo


11

Eu quero que um script seja executado uma vez por dia, todos os dias, iniciando a qualquer momento entre 0900 e 1200.
Não tenho certeza absoluta sobre a sintaxe do traço - isso significa que o script será executado A CADA hora entre 9-12ou iniciará RANDOMLY entre 9-12? Porque eu preciso do último.

Respostas:


7

Eu nunca vi uma implementação cron que tenha uma maneira de executar um trabalho em um momento aleatório. É um requisito estranho. Como indica a documentação, 9-12é um atalho para 9,10,11,12, e significa a cada hora das 9 às 12.

Se você deseja executar um trabalho em um momento aleatório, execute-o no início do intervalo e adicione um atraso aleatório. Por exemplo, para executar em uma hora aleatória entre 9 e 12:

SHELL=/bin/bash
0 9 * * * sleep $((3600 * (RANDOM % 4))); do_stuff

Observe que RANDOMrequer bash ou ksh, ele pode não estar disponível no shell padrão.

Se você deseja executar em um tempo aleatório entre 9 e 12, com segunda resolução, pode usar RANDOM % 10800como atraso, mas como RANDOMestá no intervalo de 0 a 32767, haverá uma tendência a atrasos entre 0 e 32768% 10800 = 368. Para evitar esse viés:

SHELL=/bin/bash
0 9 * * * max=$((32768/10800*10800)); while delay=$RANDOM; ((delay > max)); do :; done; sleep $((delay % 10800)); do_stuff

5
"É um requisito estranho." Discordo. Muitos aplicativos, especialmente aqueles que precisam fazer check-in periodicamente com um servidor (como gerenciadores de pacotes ou clientes de gerenciamento de configuração), precisam exibir seus tempos de execução para evitar uma situação de rebanho trovejante . De fato, muitos desses aplicativos possuem opções integradas (por exemplo, --randomwaitargumento para yum ou --splayargumento para chef-client), mas para aqueles que não têm, um tempo de execução aleatório seria um recurso útil para se ter em um agendador de tarefas.
jayhendren

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.