Tâches Cron et de façon aléatoire, à l'intérieur heures
J'ai besoin de la capacité à exécuter un script PHP à 20 fois par jour à complètement aléatoire fois. Je veux aussi qu'il fonctionne uniquement entre 9h - 11pm.
Je suis familier avec la création de tâches cron sous linux.
- La question n'est pas très bien posée. En fin de compte vous souhaitez distribuer 20 points sur l'axe du temps entre 9h et 11h. Mais il y a des contraintes sur le minimum de différence de temps? Est de ne rien faire entre 9 h et 10 h 30 acceptable? La seule façon de le faire de façon acceptable semble Klaus " l'idée: sélectionnez votre 20 fois à 09:00, ce qui vous permet de satisfaire toutes les contraintes que vous pourriez avoir, puis de planifier les choses avec "à".
Vous devez vous connecter pour publier un commentaire.
Si je comprends bien ce que vous cherchez, vous aurez besoin de faire quelque chose d'un peu brouillon, comme avoir une tâche cron qui s'exécute un script bash qui permet de rendre aléatoire le temps d'exécution,... quelque Chose comme ceci:
crontab:
et dans /chemin/vers/bashscript:
Quelques remarques: cette approche un peu du gaspillage de ressources, car il déclenche de 20 processus d'arrière-plan à 9h du matin, chaque de ce qui attend autour d'un nombre aléatoire de minutes (jusqu'à 14 heures, c'est à dire 11pm), puis lance le script php et les sorties. Aussi, depuis qu'il utilise un nombre aléatoire de minutes (pas de secondes), le temps de démarrage ne sont pas aussi aléatoire qu'ils pourraient l'être. Mais $ALÉATOIRE ne va que jusqu'à 32 767, et il y a 50,400 secondes entre 9h et 11h du soir, ce serait un peu plus compliqué à rendre aléatoire les secondes ainsi. Enfin, étant donné que les heures de départ sont aléatoires et indépendantes les unes des autres, il est possible (mais peu probable) que deux ou plusieurs instances du script sera lancé simultanément.
((maxdelay = 14 * 60))
ou((delay = $RANDOM % maxdelay))
). Lesleep
argument doit toujours être la façon dont vous l'avez (bien que vous pouvez ajouter des espaces, si désiré).sleep $[ ( $RANDOM % 60 ) + 1 ]s && some_script.sh
Ouais, ouais, la question est plus d'un an, mais je peux peut-être ajouter quelque chose d'utile:
Comment cron quelque chose à un décalage aléatoire de 20 fois par jour, entre 9 heures et 11 heures du soir? C'est un peu délicate au sein de cron, parce que vous êtes en divisant 14 heures par 20 temps d'exécution. Je n'aime pas les autres réponses très bien car ils nécessitent la rédaction d'un bash script pour votre script php.
Toutefois, si vous me permettez la liberté à l'aise le moment et la fréquence de restriction à 13 fois entre 8:30 et 11:09pm, cela pourrait faire l'affaire, et tous dans les limites de votre crontab:
${RANDOM:3:2} utilise bash $de HASARD que d'autres personnes ont mentionné ci-dessus, mais ajoute bash tableau de découpage. Depuis bash variables non typées, la pseudo-aléatoire signé de 16 bits nombre obtient tronqué à la première de 2 de ses 5 chiffres après la virgule, vous donnant un bref one-liner pour retarder votre tâche cron entre 10 et 99 minutes (si la distribution est biaisée en faveur de 10 à 32).
Suivantes peuvent également travailler pour vous, mais j'ai trouvé ça à faire être moins "aléatoire" pour une raison quelconque (peut-être la Loi de Benford est déclenchée par la modulation de nombres pseudo-aléatoires. Hey, je ne sais pas, j'ai raté les maths... c'est la faute sur le coup!):
Vous avez besoin de calculer le module en tant que '\%' ci-dessus, car cron (enfin, au moins sous Linux 'vixie-cron') met fin à la ligne quand il rencontre un sans échappement '%'.
Vous pourriez peut-être obtenir les 7 autres exécutions de scripts en y ajoutant une autre ligne avec un autre de 7 heures. Ou vous détendre votre restriction entre 3h du matin et 11 heures du soir.
$[(RANDOM/368)+10]
?$((RANDOM % 90 + 10))
Test:for i in {0..9999}; do echo $((RANDOM % 90 + 10)); done | sort | uniq -c
$RANDOM
:sleep $(( $(od -N1 -tuC -An /dev/urandom) \% 90 ))m
.crontab
est à l'aide debash
avant d'utiliser$RANDOM
. Si vous avezvixie-cron
(qui semble être mon cas sur Ubuntu), vous pouvez ensuite ajouterSHELL=/bin/bash
vers le haut. Il y a plus de solutions de rechange pour les autres cron versions ici: superuser.com/a/264541/260350crontab: errors in crontab file, can't install. Do you want to retry the same edit?
s'il vous plaît aiderDonc je suis en utilisant la suite pour exécuter une commande entre 1H et 330AM
Qui a pris soin de mes aléatoire besoin pour moi. C'est 9000 secondes == 150 minutes == 2,5 heures
Cron offre un
RANDOM_DELAY
variable. Voircrontab(5)
pour plus de détails.C'est fréquemment observées dans
anacron
emplois, mais peut aussi être utile dans uncrontab
.Vous pourriez avoir besoin d'être prudent avec ce que si vous avez quelques travaux qui s'exécutent à l'amende
(minute) de granularité et d'autres qui sont grossiers.
RANDOM_DELAY
est établie une fois et reste constant pendant toute la durée d'exécution de la démon.cron
paquet est3.0pl1-128.1ubuntu1
RANDOM_DELAY
indicateur est fonction de cronie-crond alors que Ubuntu semble être en cours d'exécutionvixie-cron
qui manque de ce drapeau.Ma première pensée serait de créer une tâche cron lancement des 20 au hasard programmé à l'emploi. Le
at
utilitaire (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
(compatible avec bash & sh)Le 1 préfixe est à la force NON de la base de 8 interprétation de date +%N (par ex. 00551454)
Ne pas oublier de s'échapper % à l'aide de \% dans un fichier crontab
at -f [file] [timespec]
ou
echo [command] | at [timespec]
ou
at [timespec]
... et la spécification interactivecomme
script
s'enregistrement.Commande
Au exécute le texte sur stdin ou dans le fichier spécifié par
-f [file]
.Timespec
Voici la
[timespec]
la grammaire. Il peut être quelque chose comme:
0100
,2359
,1620
now + 10 minutes
2071-05-31 - 5 hours 12 minutes UTC
Si vous êtes de spécifier explicitement le fuseau horaire, certaines versions de la timespec peut seulement permettre
UTC
pour l'option fuseau horaire argument.Exemple
cat script.sh | at now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
at -f script.sh now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
L'essayer...
Vous pouvez tester le bash le traitement par le pré-pendantes
echo
et d'échapper à la|
(pipe).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 emplois réguliers, utilisez
atq
et le contenu des emplois (variables d'environnement, de configuration et de commande/script) avecat -c [jobid]
.Note
Le système fait partie de cron, et l'invite interactive en fait de capture de l'ensemble de l'état actuel de votre coquille, de sorte que vous pouvez exécuter des commandes sans spécifier les chemins d'accès absolus.
Pour ceux qui googlé le chemin ici:
Si vous utilisez anacron(Ubuntu desktop et laptop) ensuite, vous pouvez modifier
et ajouter
Où XX est le nombre de minutes que vous souhaitez retarder la base de travail.
Anacron est comme cron, mais il ne s'attend pas à votre ordinateur pour être sur 24x7 (comme nos ordinateurs portables) et exécuter les scripts que c'est raté parce que le système était en panne.
al-x 's Solution ne fonctionne pas pour moi, car crontab commandes ne sont pas exécutées en bash mais en sh, je suppose. Ce qui fonctionne est: