Programar trabalho em intervalos irregulares

5

É bastante simples usar cron para agendar um trabalho para ocorrer periodicamente. Eu gostaria que algo ocorresse com menos frequência - digamos, execute o trabalho e espere de 2 a 12 horas antes de tentar novamente. (Qualquer tipo razoável de aleatoriedade funcionaria aqui.) Existe uma boa maneira de fazer isso?

    
por Charles 25.07.2014 / 18:18

2 respostas

9

Você poderia usar o comando 'at'

at now +4 hours -f commandfile

Ou

at now +$((($RANDOM % 10)+2)) hours -f commandfile
    
por 25.07.2014 / 18:32
6

Opção 1

Agende seu trabalho no cron para ser executado a cada hora (ou a cada duas horas), mas prefixar o trabalho com algo assim (presumindo que você tenha SHELL=/bin/bash no seu crontab):

[ $[RANDOM % 12] -eq 0 ] || exit 0; YOUR_JOB_HERE

Em seguida, haverá aproximadamente um em doze chances de o trabalho ser executado toda vez que for agendado.

Opção 2

Programe uma tarefa cron que, no início do dia, calcule alguns horários aleatórios e use at para agendar todas as execuções de hoje. Isso é muito mais complicado, mas permitirá que você use diferentes distribuições aleatórias. Por exemplo, você pode querer duas horas para ter uma probabilidade muito maior que 12 horas.

Impressão fina

* Este método de gerar um número aleatório é realmente tendencioso. O problema é que o máximo (32767) não é um múltiplo par de 12 (menos um). Para ver claramente o problema, compare se o máximo foi 11 (12 × 1-1 = 11). 0 produziria 0, 1 produziria 1, etc. todo o caminho até 11 produzindo 11. Mas se fosse 13 em vez disso, 12 produziria 0 e 13 produziria 1. Portanto, 0 e 1 têm valores dois que os produzem, mas 2-11 só têm um valor, então são menos prováveis. Por isso, é tendencioso. Mudar para uma fórmula usando divisão pelo máximo não resolve o problema, apenas altera os números que são influenciados. Correções reais são muito mais código (e basicamente envolvem fingir que o máximo é o que você precisa ser tentando novamente quando não está).

    
por 25.07.2014 / 19:35