Cron job, démarrage aléatoire mais dans les délais

12

Je veux qu'un script s'exécute une fois par jour, tous les jours, à partir de 9
h 9-1200 à 12 h 00. Je ne suis pas complètement sûr de la syntaxe du tiret - cela signifie-t-il que le script s'exécutera TOUTES les heures entre les deux , ou qu'il démarrera ALÉATOIRE entre 9-12? Parce que j'ai besoin de ce dernier.

little_sg
la source

Réponses:

8

Je n'ai jamais vu d'implémentation cron qui puisse exécuter un travail à un moment aléatoire. C'est une exigence étrange. Comme l'indique la documentation, 9-12est un raccourci pour 9,10,11,12, et signifie toutes les heures de 9 à 12.

Si vous souhaitez exécuter un travail à une heure aléatoire, exécutez-le au début de l'intervalle et ajoutez un délai aléatoire. Par exemple, pour exécuter à une heure aléatoire entre 9 et 12:

SHELL=/bin/bash
0 9 * * * sleep $((3600 * (RANDOM % 4))); do_stuff

Notez que RANDOMnécessite bash ou ksh, il peut ne pas être disponible dans le shell par défaut.

Si vous souhaitez exécuter à une heure aléatoire entre 9 et 12, avec une deuxième résolution, vous pouvez utiliser RANDOM % 10800comme délai, mais comme il se RANDOMsitue dans la plage 0..32767, il y aura un biais vers les délais entre 0 et 32768% 10800 = 368. Pour éviter ce biais:

SHELL=/bin/bash
0 9 * * * max=$((32768/10800*10800)); while delay=$RANDOM; ((delay > max)); do :; done; sleep $((delay % 10800)); do_stuff
Gilles 'SO- arrête d'être méchant'
la source
5
"C'est une exigence étrange." Je ne suis pas d'accord. De nombreuses applications, en particulier celles qui doivent se connecter périodiquement à un serveur (comme les gestionnaires de packages ou les clients de gestion de configuration), doivent réduire leurs temps d'exécution afin d'éviter une situation de troupeau tonitruante . En fait, beaucoup de ces applications ont des options d'affichage intégrées (par exemple, --randomwaitargument à yum ou --splayargument à chef-client), mais pour celles qui ne le font pas, un temps d'exécution aléatoire serait une fonctionnalité utile à avoir dans un planificateur de travaux.
jayhendren
2

J'ai fini par avoir des exigences similaires pour les scripts python, mais j'ai fini par l'implémenter via le script lui-même, en utilisant les fonctions random + sleep, puis en lançant le travail cron @ midnight

from time import sleep
import random

sleep_time = random.randint(0,7200)  #7200 seconds = 2 hours * 60 min * 60 sec
print(sleep_time)
sleep(sleep_time)
FlyingZebra1
la source
C'est ainsi que les scripts courants des distributions Linux randomisent souvent l'heure de début: ayez une heure fixe, puis dormez au début.
Ned64