Exécuter un script via cron à une heure aléatoire, mais un certain nombre de fois par jour [fermé]

1

Je veux pouvoir exécuter mon script, disons, 2 ou 3 fois par jour - 24 heures - mais à une heure différente à chaque fois.

Que recommanderiez-vous une solution simple et fiable ?

Jodooomi
la source
1
Le script dure-t-il plus d'une minute? En d'autres termes, si les heures suggérées "au hasard" étaient 12h01 et 12h02, est-ce que ça irait?
Jeff Schaller
1
Votre script doit-il être exécuté deux ou trois fois par jour? Ou est-ce que cela fait partie du hasard? Les heures doivent-elles être "à peu près" équidistantes ou peuvent-elles être trois minutes consécutives? Si le script est censé être exécuté "deux ou trois fois", serait-il acceptable que le script ne soit exécuté qu'une fois par période de 24 heures?
Roaima
Je prendrais celui que vous avez trouvé avant le dernier.
Anthon

Réponses:

3

Pour exécuter le script 2 fois par jour:

0 0,12 * * * sleep $(( $$ \% 21600 )); /path/to/script.sh

Cela commencera le travail à midi et à minuit, puis dormira jusqu'à 6 heures (la moitié de l'intervalle de 12 heures) avant de commencer le script.

Pour exécuter le script 3 fois par jour:

0 0,8,16 * * * sleep $(( $$ \% 14400 )); /path/to/script.sh

Cela commencera le travail à minuit, 8h et 16h, puis dormira jusqu'à 4 heures (la moitié de l'intervalle de 8 heures) avant de commencer le script.

Puisque vous avez étiqueté ceci avec Ubuntu, vous avez probablement bash comme valeur par défaut / bin / sh, ce qui semble interpréter $ RANDOM (bien que RANDOM ne soit pas spécifié par POSIX). Par conséquent, ajustez la réponse de Zwans à:

2 courses par jour:

0 0,12 * * * sleep $(( RANDOM \% 21600 )); /path/to/script.sh

3 courses par jour:

0 0,8,16 * * * sleep $(( RANDOM \% 14400 )); /path/to/script.sh

J'ai changé le &&en ;, ce qui change le sens de "attendre que la commande de veille se termine avec succès" en "veille pendant un certain temps, puis indépendamment du fait que le sommeil se soit terminé ou ait été tué". Notez également que les éléments %à échapper doivent faire partie d’une commande cron, sinon, ils sont interprétés comme une nouvelle ligne.

Jeff Schaller
la source
Alors, quels sont les avantages et inconvénients de RANDOM vs $$?
Jodooomi
Si vous devez gérer un / bin / sh de base, il ne fournira peut-être pas $ RANDOM, mais POSIX lui demandera de fournir $$, qui était le plus proche d’un nombre "aléatoire" que je pouvais obtenir.
Jeff Schaller
Je ne comprends pas, que dois-je utiliser?
Jodooomi
2
Si vous utilisez les lignes avec RANDOMqui est une variable spécifique à bash, vous devez ajouter SHELL=/bin/bashà votre crontab.
xhienne
-1

0 */12 * * * sleep $((RANDOM%x)) && /bin/sh -c /path/to/script.sh

Votre délai sera compris entre 0 et x, alors définissez cette valeur vous-même. Cela devrait s'exécuter toutes les 12 heures, avec un délai aléatoire.

Assurez-vous que cela est exécuté en utilisant bash.

Zwans
la source
2
Cron utilise /bin/shsur la plupart des systèmes, mais vous pouvez également déplacer sleeple script dans le script lui-même. Configurez simplement les entrées cron pour le nombre de fois que vous souhaitez lancer le script, et attribuez au script sleepune durée aléatoire (entre 0 et le nombre de secondes jusqu'à ce que le prochain travail cron démarre).
Kusalananda
2
méfiez-vous également des mots %cron pour une nouvelle ligne, vous devez donc y échapper.
Jeff Schaller