Ich habe ein seltsames Problem mit $ RANDOM in cron. Ich möchte einen Befehl eine zufällige Anzahl von Minuten nach dem Auslösen des Cronjobs ausführen.
Dieses Beispiel funktioniert direkt im Terminal und verzögert den Befehl um bis zu 30 Sekunden (ersetzen Sie den Befehl durch einen beliebigen Befehl, es ist tatsächlich ein Echo an / dev / ttyUSB0):
sleep `expr $RANDOM \% 30` ; command
Wenn dieselbe Zeile in crontab platziert ist, wird der Befehl immer sofort und ohne Verzögerung ausgelöst:
* * * * * sleep `expr $RANDOM \% 30` ; command
Wenn ich einen Ausdruck ohne $ RANDOM verwende, funktioniert er einwandfrei - dies führt zu einer Verzögerung von 15 Sekunden:
* * * * * sleep `expr 10 + 5` ; command
Mit anderen Worten, es scheint, als ob $ RANDOM in einem Cron nicht funktioniert.
Dies liegt jedoch nicht einfach daran, dass $ RANDOM selbst zu Null ausgewertet wird, da dies dann eine Verzögerung von 10 ergeben sollte:
* * * * * sleep `expr $RANDOM \% 30 + 10` ; command
Ich habe es auch mit && instread of versucht; aber das hilft nicht. Tatsächlich wird der Befehl dann überhaupt nicht ausgelöst!
Ich könnte die Verzögerung natürlich in ein Skript einfügen, das dann von crontab aufgerufen wird, aber das erklärt mein Problem nicht und bringt mich nicht zum Lernen :-)
Es ist Debian Lenny, wenn das einen Unterschied macht.
/bin/sh
es sich nicht um eine tatsächliche Shell handelt, sondern lediglich um einen Symlink zur bevorzugten Shell des Systemadministrators (normalerweise Bash oder Dash) auf Debian./bin/sh
(und erwartet, dass sie mit der Bourne-Shell kompatibel ist). Ein Beispiel ist diesystem()
Funktion in glibc. Zeigt daher/bin/sh
normalerweise auf die schnellste Bourne-kompatible Shell; und der Systemadministrator soll seine Präferenz in der entsprechenden Zeile von / etc / passwdsh
zubash
, aber es schien nicht relevant.)/bin/sh
Punkte zu stürzen. Bis jetzt habe ich noch nie von Dash gehört. Ich habe es nachgeschlagen und es ist eine leichte Variante von Bash. Ich wusste auch nicht, dass Cron in einer "verkrüppelten" Umgebung läuft, aber es erklärt verschiedene andere Probleme, die ich in der Vergangenheit hatte. Übrigens habe ich angefangen zu benutzen,$(())
aber da es nicht funktioniert hat, habe ich alle möglichen Variationen ausprobiert und bin am Ende dazu gekommenexpr
- was natürlich auch nicht funktioniert hat. Aber hier habe ich geendet :-) Ist es möglich, eine normale Bash-Shell ohne die Einschränkungen mit auszuführenbash -c 'xxxx'
? Übrigens, ist es nicht möglich, Zeilenumbrüche in Kommentare einzufügen?dash
ist eine Shell. Es ist nicht mehr oder weniger normal alsbash
. Es ist auch keine Variante davon. 2) Siehe Punkte 1 und 2 in der Antwort.cron
Wird normalerweise mit einer weniger "vollständigen" Umgebung ausgeführt, was bedeutet, dass Ihnen einfach nicht viele der gleichen Umgebungsvariablen zur Verfügung stehen. Anscheinend$RANDOM
ist dies einer der Fälle, und tatsächlich schlägt Ihrsleep
Befehl aufgrund der undefinierten Variablen einfach mit einem Fehler fehl. Deshalb konnte Ihr Befehl überhaupt nicht ausgeführt werden, als Sie zu&&
statt gewechselt haben;
. (Nun, eigentlich$RANDOM
handelt es sich um eine Bash-Funktion, die jedochcron
nicht in einer vollständigen Bash-Umgebung ausgeführt wird, in der diese Funktion offensichtlich fehlt.)Um diese Aufgabe auszuführen, müssen Sie, wie gesagt, ein separates Bash-Skript verwenden. Alternativ können Sie möglicherweise eine Möglichkeit finden, die Sie
cat /dev/urandom
direkt imcron
Befehl verwenden können. Es ist jedoch wahrscheinlich einfacher, das, was Sie derzeit haben, in ein separates Bash-Skript zu verschieben.quelle
od -An -N1 -i /dev/urandom
\% 30); Befehl$RANDOM
ist nicht Teil einer "vollständigen" Umgebung. Es hat nichts mit Umgebungsvariablen zu tun, die bei einem Prozessstart festgelegt wurden. Es ist eine spezielle Variable, die "on the fly" in bash erstellt wird. Sein neuer Wert wird immer generiert, wenn die Variable gelesen wird. ---cron
Verwendet standardmäßig/bin/sh
auf Systemen, mit denen/bin/sh
keine Verknüpfung besteht,bash
$RANDOM
standardmäßig nicht.