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.