
Eu gostaria de escrever um comando cron para que um trabalho fosse executadouma vezem algum momento aleatório durante a semana - isso é possível sem que o crontab se modifique? Eu considerei escrever uma função que, com base em um gerador de números aleatórios, possa ou não executar a tarefa - mas gostaria que o comando fosse executado definitivamente e que não houvesse nenhum segundo na semana que fosse mais provável do que qualquer outro segundo...
Responder1
Uma solução rápida é escrever um script cron que é chamado uma vez por semana e se atrasa por um tempo aleatório (não mais que uma semana) antes de fazer o trabalho real, por exemplo, usando o seguinte comando (funciona para bash e zsh)
sleep $(($RANDOM/32768.*60*24*7))m
Responder2
Use uma combinação de cron
e at
. Seu script crontabbed conterá algo semelhante a:
TIME=$(($RANDOM/32768.*60*24*7))m
at -f /usr/local/bin/scriptfile $TIME
Tenha /usr/local/bin/scriptfile
os comandos que deseja executar.
Responder3
Uma solução rápida (e suja e RUIM, veja os comentários abaixo) para esse problema seria criar um script bash que seria executado todos os dias como um cron e projetado da seguinte forma:
Esse script de shell teria 1/7 de chance de executar seu comando todos os dias e atualizaria o carimbo de data e hora de um arquivo cada vez que ele fosse executado com êxito (use 'touch' para isso).
Você só precisaria verificar se o arquivo tem mais de 7 dias para decidir se deseja executar o script com antecedência ('find' pode fazer o trabalho aqui).
Deve haver uma maneira melhor, mas estou cansado demais para ver ^^
atualizar: Como Joe apontou, este script tem uma grande falha: ele pode (e eventualmente) não ser executado em algumas semanas. Portanto você não deve usá-lo, mas deixarei como contra-exemplo.
Responder4
Eu montei um pequeno script chamado weekrand
(procurei conselhos em algum lugar online, esqueci onde estava) que faz exatamente isso:
#!/bin/bash
FLOOR=1
RANGE=10080 # number of minutes per week
number=0 #initialize
while [ "$number" -le $FLOOR ]
do
number=$RANDOM
let "number %= $RANGE" # Scales $number down within $RANGE.
done
sleep ${number}m
$@
Então, basicamente, weekrand {some command} {parameters}
será executado aleatoriamente {some command}
entre {parameters}
0 e 10.080 minutos, ou seja, dentro de uma semana.
Um exemplo crontab
de linha usando-o:
0 0 1 * * nice -n 10 /usr/local/bin/weekrand /root/jobs/weekly_job