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 ?
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 ?
Réponses:
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.
RANDOM
qui est une variable spécifique à bash
, vous devez ajouter SHELL=/bin/bash
à votre crontab.
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
.
/bin/sh
sur la plupart des systèmes, mais vous pouvez également déplacer sleep
le 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 sleep
une durée aléatoire (entre 0 et le nombre de secondes jusqu'à ce que le prochain travail cron démarre).
%
cron pour une nouvelle ligne, vous devez donc y échapper.