Você poderia usar o comando 'at'
at now +4 hours -f commandfile
Ou
at now +$((($RANDOM % 10)+2)) hours -f commandfile
É 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?
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.
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.
* 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á).
Tags cron scheduling at