Mit-SUers,
Ich versuche, einen Watchdog-Cron-Job auszuführen, um sicherzustellen, dass ein Prozess ausgeführt wird (DreamHost beendet weiterhin Prozesse). Ich war von dieser SU-Frage inspiriert .
Die Doppelpfeife ||
scheint jedoch nicht zu funktionieren.
Mein Cron-Eintrag:
# watchdog
MAILTO="[email protected]"
@daily . ~/.bashrc && cd /home/chucknorris/workingfolder/ && pgrep -f "python /home/chucknorris/workingfolder/web2py.py -K LLBean" > /dev/null || echo Hello
Das Problem ist: Wenn der Python-Prozess nicht ausgeführt wird, erhalte ich keine "Hallo" -Nachricht per E-Mail.
Wenn ich auf Singlepipe umsteige |
pgrep -f "python /home/chucknorris/workingfolder/web2py.py -K LLBean" > /dev/null | echo Hello
Der Cron-Job läuft einwandfrei. Ich habe die Nachricht erhalten, Hello
wenn mein Python-Prozess ausgeführt wird.
Auf der anderen Seite läuft das Doppelrohr feines direkt in der Schale.
Also es scheint mir ||
nicht nur im cron job zu arbeiten.
Würden Sie mir bitte helfen, herauszufinden, warum?
Vielen Dank!
||
einer "doppelten Pipe". Es ist eine logische 'oder' Operation und hat nichts mit Pipes zu tun.Antworten:
Ich denke hier ist kein Grund, warum es nicht funktionsfähig ist.
Doppelrohr "||" ist ein logischer ODER-Operator im Shell-Ausdruck.
Ihr Befehl lautet ungefähr so:
cmd_group_1 && cmd_group_2 && cmd_group_3 || cmd_group_4
Zum Beispiel:
A)
B)
BEARBEITEN:
Ich teste den unten genannten crontab-Eintrag in cron und er funktioniert:
* * * * * aaa || echo "hello" >>/tmp/test
aaa ist kein vorhandener Befehl, daher schlägt dieser fehl und hallo wird in / tmp / test geschriebenquelle
pgrep
fehlschlägt (kein Prozess läuft), wird cmd_group_4 ausgeführt, um mich zu benachrichtigen. Ich vermute, es ist auch ein logisches Problem. Vielleicht sollte ich alles in einem Shell-Skript anstelle eines langen Cron-Befehls ausführen.Die @ -Periode ersetzt die Angabe von Datum und Uhrzeit. IMHO cron sollte einen Fehler im Syslog erzeugen, der über "." ein ungültiger Benutzer sein. Es sei denn, dies ist bereits ein Benutzer crontab.
Ihre Frage enthält keine Details zum Kontext: - Distribution - Version - wo dieser Cron gespeichert ist (Pfad ist für einige Aspekte kritisch) - Name der Datei (Name ist auch kritisch) - Cron-Conf-Datei
Insbesondere gibt der von Ihnen bereitgestellte Extrakt nicht die verwendete Shell an. und Sie laden eine bashrc-Datei, während bash fast nie die verwendete Shell ist. Abhängig vom Inhalt Ihrer bashrc-Datei ist das Verhalten auf der Ebene des Versuchs, den Punkt auszuführen, bereits unvorhersehbar.
Abhängig von der Shell wird && möglicherweise nicht unterstützt.
Der letzte Teil Ihrer Zeile wird wahrscheinlich nie interpretiert, weil er nur nie von der Shell gelesen wird. Tatsache ist, dass die meisten Cron-Implementierungen eine maximale Länge haben. und jedes Byte nach dieser Grenze wird einfach ignoriert. Diese Grenze kann bei Implementierungen zwischen 128 und 1024 Byte variieren, für das, was ich getroffen habe. Die häufigsten Werte sind 192 und 256. Und natürlich meldet cron dieses Problem nicht in Syslogs (auch nicht beim Neuladen).
Da Sie keinen Kontext angeben, müssen Sie die Manpage selbst lesen, abhängig von Ihrer Distribution, Ihrer Version und dem verwendeten Cron-Paket.
Ich weiß, dass ich die Frage nicht wirklich beantworte, weil die gestellte Frage mehrdeutig ist und keine Antwort erhalten kann.
Sie können die globale Syntax mit einer kürzeren Zeile testen, z.
Fügen Sie dann Ihren Code in ein Skript ein (ich füge Benutzerskripte in ~ / .sh / und Systemskripte in / usr / local / bin für benutzerzugängliche Skripte und / usr / local / sbin für benutzerunzugängliche Skripte ein).
quelle