comando cron aleatório

comando cron aleatório

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 crone 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/scriptfileos 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 crontabde linha usando-o:

 0  0    1   *   *      nice -n 10 /usr/local/bin/weekrand /root/jobs/weekly_job

informação relacionada