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.

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

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)

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.