comando cron randomizado

2

Eu gostaria de escrever um comando cron para que um job fosse executado uma vez em algum momento aleatório durante a semana - isso é possível sem que o crontab se modifique? Eu considerei escrever uma função que, baseada em um gerador de números aleatórios, pode ou não executar a tarefa - mas eu gostaria que o comando fosse executado definitivamente e não houvesse um segundo na semana que fosse mais provável do que qualquer outro. segundo ...

    
por Joe 07.02.2012 / 16:04

5 respostas

5

Uma solução rápida é escrever um script cron chamado uma vez por semana e se atrasa por um tempo aleatório (não mais que a 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
    
por 07.02.2012 / 16:59
1

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

Em /usr/local/bin/scriptfile tem os comandos que você deseja executar.

    
por 07.02.2012 / 17:29
0

Uma solução rápida (e suja, e BAD, 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 registro de data e hora de um arquivo sempre que fosse executado com êxito (use 'toque' para isso). Você só precisa verificar se o arquivo tem > 7 dias para decidir se o script foi executado com antecedência ("encontrar" pode fazer o trabalho aqui).

Deve haver uma maneira melhor, mas estou cansado demais para ver isso ^^

update : Como Joe apontou, este script tem uma grande falha, pois pode (e eventualmente) não ser executado em algumas semanas. Assim, você não deve usá-lo, mas vou deixá-lo como um contra-exemplo.

    
por 07.02.2012 / 16:18
0

lacqui está correto, mas sua explicação é um pouco curta.

cron:

0 15 * * 1 /home/myhome/cron/schedulerandomjob.bash

/home/myhome/cron/schedulerandomjob.bash:

#!/bin/bash 
TIME="now + $(( RANDOM % (60*24*7) )) minutes "
at -f /path/to/your/script $TIME 

O cron é executado uma vez por semana, agendando um trabalho 'at' que ocorre aleatoriamente durante a semana. (n. Há um caso de canto aqui para observar ... pode ser possível que o trabalho ocorra no final da semana e no começo da semana, o que pode causar duas execuções simultâneas. Se for importante, subtraia alguns minutos do módulo para ter certeza.

    
por 08.02.2012 / 16:14
0

Eu criei um pequeno script chamado weekrand (procurei em algum lugar on-line por um conselho, 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} executará {some command} com {parameters} entre 0 e 10080 minutos, ou seja, dentro de uma semana.

Um exemplo de crontab linha usando:

 0  0    1   *   *      nice -n 10 /usr/local/bin/weekrand /root/jobs/weekly_job
    
por 05.09.2012 / 13:09

Tags