J'ai un étrange problème avec $ RANDOM dans cron. Je souhaite exécuter une commande un nombre aléatoire de minutes après le déclenchement du cronjob.
Cet exemple fonctionne directement dans le terminal et retarde la commande jusqu'à 30 secondes (remplacez la commande par ce que vous voulez, c'est en fait un écho à / dev / ttyUSB0):
sleep `expr $RANDOM \% 30` ; command
Si la même ligne est placée dans crontab, la commande se déclenche toujours immédiatement sans délai:
* * * * * sleep `expr $RANDOM \% 30` ; command
Si j'utilise une expression sans $ RANDOM, cela fonctionne très bien - cela fait un délai de 15 secondes:
* * * * * sleep `expr 10 + 5` ; command
En d'autres termes, il semble que $ RANDOM ne fonctionne pas dans un cron.
Mais ce n'est pas simplement parce que $ RANDOM lui-même est évalué à zéro, car cela devrait donner un délai de 10:
* * * * * sleep `expr $RANDOM \% 30 + 10` ; command
J'ai également essayé avec && instread de; mais cela n'aide pas. En fait, alors la commande ne se déclenche pas du tout!
Je pourrais bien sûr placer le retard dans un script qui est ensuite appelé depuis crontab, mais cela n'explique pas mon problème et ne me fait pas apprendre :-)
C'est Debian Lenny si cela fait une différence.
/bin/sh
n'était pas un shell réel, simplement un lien symbolique vers le shell préféré du sysadmin (généralement bash ou dash) sur Debian./bin/sh
(et s'attend à ce qu'il soit compatible avec le shell Bourne). Un exemple est lasystem()
fonction dans la glibc. Par conséquent,/bin/sh
pointe généralement vers le shell compatible Bourne le plus rapide ; et l'administrateur système est censé définir sa préférence dans la ligne appropriée de / etc / passwd, et non pas appliquer cette préférence à l'échelle du systèmesh
versbash
, mais cela ne semblait pas pertinent.)/bin/sh
pointe pour se précipiter. Jusqu'à présent, je n'ai jamais entendu parler de dash. Je l'ai recherché et c'est une variante légère de bash. De plus, je ne savais pas que cron fonctionnait dans un environnement "paralysé", mais cela explique divers autres problèmes que j'ai eu par le passé. En fait, j'ai commencé à utiliser,$(())
mais comme cela ne fonctionnait pas, j'ai essayé toutes sortes de variantes et je me suis retrouvé avecexpr
- ce qui bien sûr ne fonctionnait pas non plus. Mais c'est là que j'ai fini :-) Est-il possible d'exécuter un shell bash normal sans les limitations d'utilisationbash -c 'xxxx'
? Au fait, n'est-il pas possible de mettre des sauts de ligne dans les commentaires?dash
est un shell. Ce n'est pas plus ou moins normal quebash
. Ce n'est pas une variante non plus. 2) Voir les points # 1 et # 2 dans la réponse.cron
s'exécute généralement avec un environnement moins "complet", ce qui signifie que vous n'avez tout simplement pas à disposition plusieurs des mêmes variables d'environnement. Apparemment,$RANDOM
c'est l'un d'entre eux, et en fait, votresleep
commande échoue simplement avec une erreur en raison de la variable non définie - c'est pourquoi votre commande n'a pas pu s'exécuter du tout lorsque vous êtes passé à la&&
place de;
. (Eh bien, en fait,$RANDOM
c'est une fonction Bash, maiscron
ne fonctionne pas dans un environnement Bash complet, qui n'a évidemment pas cette fonction.)Pour accomplir cette tâche, vous devrez utiliser un script Bash distinct, comme vous l'avez dit. Alternativement, vous pourriez être en mesure de trouver un moyen d'utiliser
cat /dev/urandom
directement dans lacron
commande, mais il serait probablement plus facile de simplement déplacer ce que vous avez actuellement vers un script Bash séparé.la source
od -An -N1 -i /dev/urandom
\% 30); commande$RANDOM
ne fait pas partie d'un environnement "complet". Cela n'a rien à voir avec les variables d'environnement définies au démarrage d'un processus. Il s'agit d'une variable spéciale créée "à la volée" dans bash. Sa nouvelle valeur est toujours générée chaque fois que la variable est lue. ---cron
par défaut/bin/sh
, les systèmes sur lesquels il/bin/sh
n'est pas liébash
$RANDOM
ne fonctionneront pas par défaut.