119 votes

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

Je dois pouvoir exécuter un script 20 fois par jour à des heures complètement aléatoires. Je veux également qu'il ne s'exécute qu'entre 9 h et 23 h.

Je suis familier avec la création de tâches cron sous linux.

2 votes

La question n'est pas très bien posée. En fin de compte, vous voulez distribuer 20 points sur l'axe du temps entre 9 heures et 11 heures. Mais existe-t-il des contraintes sur la différence de temps minimale ? Ne rien faire entre 9h et 10h30 est-il acceptable ? La seule façon d'y parvenir de manière acceptable semble être l'idée de Klaus : sélectionnez vos 20 heures à 09:00, ce qui vous permet de respecter toutes les contraintes que vous pourriez avoir, puis programmez les choses avec "à".

7voto

klaus Points 359

Ma première idée serait de créer une tâche cron qui lancerait 20 tâches programmées de manière aléatoire. Le site at (http://unixhelp.ed.ac.uk/CGI/man-cgi?at) est utilisé pour exécuter des commandes à un moment précis.

0 votes

Un exemple d'utilisation de at est ici : stackoverflow.com/a/6136145/803174

3voto

Wilbert Points 191

La solution d'al-x ne fonctionne pas pour moi puisque les commandes crontab ne sont pas exécutées dans bash mais dans sh je suppose. Ce qui marche, c'est :

30 8 * * * bash -c "sleep $[RANDOM\%90]m" ; /path/to/script.py

0 votes

J'ai tout essayé et ça n'a toujours pas marché pour moi. Votre post m'a expliqué pourquoi, merci !

1 votes

$[ ... ] est une syntaxe dépréciée depuis bien longtemps ; pour tout ce qui date de ce millénaire, il faut préférer $((RANDOM\%90))m qui est une syntaxe compatible POSIX (mais bien entendu RANDOM n'est toujours que Bash).

2voto

MLP Points 11

Je me rends compte que c'est un vieux fil de discussion, mais je veux ajouter une chose liée aux valeurs aléatoires que j'utilise souvent. Au lieu d'utiliser la variable $RANDOM avec une plage fixe et limitée, je crée souvent des valeurs aléatoires de plage arbitraire dans le shell avec

dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -N4 -t u4 -A none

pour que vous puissiez faire, par exemple,

FULLRANDOM=$(dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -N4 -t u4 -A none)

et de surmonter certaines des restrictions qui ont été discutées dans ce fil.

1 votes

Bienvenue à SO. Eh bien, vieux fil ou pas, cela m'a envoyé sur ~$info dd et je peux comprendre ce qu'il se passe sur le côté gauche de | mais je ne peux pas voir le côté droit. Donc, pour moi et les autres personnes intéressées overcoming some restrictions dans la génération de valeurs aléatoires, pourquoi ne pas prendre le temps d'expliquer l'ERS et d'argumenter en faveur de l'utilisation de votre approche. La profondeur de l'explication rend les gens à l'aise avec le processus que vous suggérez et ses avantages Merci.

2 votes

Ah ok. od aka "octal dump" prend un fichier ou stdin et vide les données binaires dans une forme lisible par l'homme. Nous voulons que notre nombre soit affiché comme un décimal non signé (-t u4), et nous ne voulons pas l'index d'adresse (-A none). Le -N4 est redondant puisque nous ne prenons que 4 octets, mais ne fait pas de mal non plus. J'espère que cela explique tout...

1voto

mcint Points 517

at -f [file] [timespec]

o

echo [command] | at [timespec]

o

at [timespec] ... et des spécifications interactives comme script de l'enregistrement.

Commande

En cours, le texte prévoit stdin ou dans le fichier spécifié par -f [file] .

Timespec

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

  • Heure de 24 heures sous la forme d'un nombre entier à 4 chiffres, par ex. 0100 , 2359 , 1620
  • now + 10 minutes
  • 2071-05-31 - 5 hours 12 minutes UTC

Si vous spécifiez explicitement le fuseau horaire, certaines versions du timespec pourrait seulement permettre UTC pour l'argument facultatif du 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

Essayez-le...

Vous pouvez tester l'analyse syntaxique de bash en plaçant en pré-pending echo et d'é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 programmés, utilisez atq et le contenu du travail (vars d'environnement, setup, et commande/script) avec at -c [jobid] .

Note

Le système fait partie de cron, et l'invite interactive capture en fait l'ensemble de l'état actuel de votre shell, de sorte que vous pouvez exécuter des commandes sans spécifier de chemin absolu.

1voto

Houssin Boulla Points 219

Vous pouvez essayer avec cet exemple d'utiliser des temps aléatoires avant d'exécuter la commande :

#!/bin/bash
# start time
date +"%H:%M:%S"

# sleep for 5 seconds
sleep $(shuf -i 1-25 -n 1)
# end time
date +"%H:%M:%S"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X