
Me gustaría escribir un comando cron para que se ejecute un trabajouna vezen algún momento aleatorio durante la semana: ¿es esto posible sin que el crontab se modifique? He considerado escribir una función que, basada en un generador de números aleatorios, pueda ejecutar o no la tarea, pero me gustaría que el comando se ejecute definitivamente y que no haya un segundo en la semana que sea más probable que cualquier otro. segundo...
Respuesta1
Una solución rápida es escribir un script cron que se llame una vez a la semana y se retrase durante un tiempo aleatorio (no más de una semana) antes de realizar el trabajo real, por ejemplo, usando el siguiente comando (funciona para bash y zsh)
sleep $(($RANDOM/32768.*60*24*7))m
Respuesta2
Utilice una combinación de cron
y at
. Su script crontab contendrá algo similar a:
TIME=$(($RANDOM/32768.*60*24*7))m
at -f /usr/local/bin/scriptfile $TIME
Tengo /usr/local/bin/scriptfile
los comandos que desea ejecutar.
Respuesta3
Una solución rápida (y sucia y MALA, consulte los comentarios a continuación) a ese problema sería crear un script bash que se ejecutaría todos los días como un cron y estaría diseñado de la siguiente manera:
Ese script de shell tendría una probabilidad de 1/7 de ejecutar su comando todos los días y actualizaría la marca de tiempo de un archivo cada vez que se ejecute correctamente (use 'toque' para eso).
Sólo tendría que verificar que el archivo tenga más de 7 días para decidir si ejecuta el script de antemano ('buscar' puede hacer el trabajo aquí).
Debe haber una manera mejor pero estoy demasiado cansado para verla ^^
actualizar: Como Joe señaló, este script tiene un gran defecto en el sentido de que puede (y eventualmente) no ejecutarse en absoluto durante algunas semanas. Por lo tanto no deberías usarlo pero lo dejaré como contraejemplo.
Respuesta4
Creé un pequeño script llamado weekrand
(busqué consejo en algún lugar en línea, olvidé dónde estaba) que hace precisamente eso:
#!/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
$@
Básicamente, weekrand {some command} {parameters}
se ejecutará aleatoriamente {some command}
entre {parameters}
0 y 10080 minutos, es decir, dentro de una semana.
Una crontab
línea de ejemplo usándolo:
0 0 1 * * nice -n 10 /usr/local/bin/weekrand /root/jobs/weekly_job