comando cron aleatorio

comando cron aleatorio

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 crony 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/scriptfilelos 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 crontablínea de ejemplo usándolo:

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

información relacionada