Travaux Cron et temps aléatoires, dans des heures données

J’ai besoin de pouvoir exécuter un script PHP 20 fois par jour à des moments complètement aléatoires. Je veux aussi qu’il ne fonctionne que de 9h à 23h.

Je suis familier avec la création de travaux cron sous Linux.

Si je comprends ce que vous cherchez, vous devrez faire quelque chose d’un peu désordonné, comme avoir un job cron qui exécute un script bash qui aléatoire les temps d’exécution … Quelque chose comme ceci:

crontab:

0 9 * * * /path/to/bashscript 

et dans / path / to / bashscript:

 #!/bin/bash maxdelay=$((14*60)) # 14 hours from 9am to 11pm, converted to minutes for ((i=1; i< =20; i++)); do delay=$(($RANDOM%maxdelay)) # pick an independent random delay for each of the 20 runs (sleep $((delay*60)); /path/to/phpscript.php) & # background a subshell to wait, then run the php script done 

Quelques remarques: cette approche est un peu un gaspillage de ressources, car elle déclenche 20 processus en arrière-plan à 9 heures, chacun d’entre eux attend un nombre aléatoire de minutes (jusqu’à 14 heures, soit 11 heures), puis lance le script php et sorties. De plus, comme il utilise un nombre aléatoire de minutes (et non de secondes), les heures de début ne sont pas aussi aléatoires qu’elles le pourraient. Mais $ RANDOM ne monte qu'à 32 767, et il y a 50 400 secondes entre 9h et 23h, il serait un peu plus compliqué de randomiser les secondes également. Enfin, les temps de démarrage étant aléatoires et indépendants les uns des autres, il est possible (mais peu probable) que deux instances ou plus du script soient démarrées simultanément.

Oui, oui, la question a plus d’un an, mais je peux peut-être append quelque chose d’utile:

Comment créer quelque chose au hasard 20 fois par jour entre 9h et 23h? C’est un peu difficile au sein de cron, car vous divisez 14 heures par 20 temps d’exécution. Je n’aime pas beaucoup les autres réponses car elles nécessitent l’écriture d’un script wrapper bash pour votre script php.

Cependant, si vous me permettez de limiter le délai et la fréquence à 13 fois entre 8h30 et 23h09, cela pourrait faire l’affaire, et tout cela dans les limites de votre crontab:

 30 8-21/* * * * sleep ${RANDOM:0:2}m ; /path/to/script.php 

$ {RANDOM: 3: 2} utilise $ RANDOM de bash comme mentionné ci-dessus, mais ajoute le découpage du tableau bash. Étant donné que les variables bash ne sont pas typées, le nombre de 16 bits signé pseudo-aléatoire est tronqué sur les 2 premiers de ses 5 chiffres décimaux, vous donnant un simple raccourci pour retarder votre tâche entre 10 et 99 minutes (bien que la dissortingbution soit orientée vers 10 à 32).

Ce qui suit pourrait aussi fonctionner pour vous, mais j’ai trouvé que cela était “moins aléatoire” pour une raison quelconque (peut-être que la loi de Benford est déclenchée par la modulation de nombres pseudo-aléatoires. Hé, je ne sais pas sur bash!):

 30 8-21/* * * * sleep $[RANDOM\%90]m ; /path/to/script.php 

Vous devez rendre le module “\%” ci-dessus car cron (au moins Linux “vixie-cron”) termine la ligne quand il rencontre un “%” non échappé.

Peut-être que vous pourriez obtenir les 7 exécutions de script restantes en ajoutant une autre ligne avec une autre plage de 7 heures. Ou relâchez votre ressortingction pour courir entre 3h et 23h.

Donc, j’utilise les éléments suivants pour exécuter une commande entre 1 heure du matin et 330 heures du matin.

 0 1 * * * perl -le 'sleep rand 9000' && *command goes here* 

Cela a pris soin de mes besoins au hasard pour moi. C’est 9000 secondes == 150 minutes == 2,5 heures

Cron propose une variable RANDOM_DELAY . Voir crontab(5) pour plus de détails.

La variable RANDOM_DELAY permet de retarder le démarrage des travaux par nombre aléatoire de minutes avec la limite supérieure spécifiée par la variable.

Cela se voit souvent dans les travaux d’ anacron , mais peut également être utile dans un crontab .

Vous devrez peut-être faire attention à cela si vous avez des tâches qui s’exécutent à une granularité fine (minute) et d’autres qui sont grossières.

Ma première pensée serait de créer un job cron qui lancera 20 tâches au hasard. L’utilitaire at (http://unixhelp.ed.ac.uk/CGI/man-cgi?at) est utilisé pour exécuter des commandes à l’heure spécifiée.

J’ai fini par utiliser sleep $(( 1$(date +%N) % 60 )) ; dostuffs sleep $(( 1$(date +%N) % 60 )) ; dostuffs (compatible bash & sh)

Le préfixe 1 est de forcer l’interprétation NON base 8 de la date +% N (par exemple 00551454)

N’oubliez pas d’échapper à% en utilisant \% dans un fichier crontab

* * * * * nobody sleep $(( 1$(date +\%N) \% 60 )) ; dostuffs

at -f [file] [timespec]

ou

echo [command] | at [timespec]

ou

at [timespec] … et une spécification interactive comme l’enregistrement du script .

Commander

At exécute le texte sur stdin ou dans le fichier spécifié par -f [file] .

Timespec

Voici la grammaire [timespec] . Cela peut être quelque chose comme:

  • 24 heures sur 4 chiffres, par exemple 0100 , 2359 , 1620
  • now + 10 minutes
  • 2071-05-31 - 5 hours 12 minutes UTC

Si vous spécifiez explicitement le fuseau horaire, certaines versions de timespec peuvent uniquement autoriser UTC pour l’argument facultatif de fuseau horaire.

Exemple

cat script.sh | at now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes

at -f script.sh now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes

Essaye le…

Vous pouvez tester l’parsing bash par echo attente et échapper à la | (tuyau).

echo cat script.sh \| at now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes

echo at -f script.sh now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes

Pour voir les travaux planifiés, utilisez atq et le contenu du travail (vars d’environnement, setup et commande / script) avec at -c [jobid] .

Remarque

Le système fait partie de cron et l’invite interactive capture en fait tout l’état actuel de votre shell. Vous pouvez donc exécuter des commandes sans spécifier de chemin absolu.

Pour ceux qui ont googlé le chemin ici:

Si vous utilisez anacron (ordinateur de bureau et ordinateur portable Ubuntu), vous pouvez modifier

 /etc/anacrontab 

et append

 RANDOM_DELAY=XX 

Où XX correspond à la durée en minutes de la tâche de base.

Anacron est comme Cron mais il ne s’attend pas à ce que votre ordinateur soit sur 24×7 (comme nos ordinateurs portables) et exécutera les scripts manqués car le système était en panne.