Doppelte Pipe "||" funktioniert nicht in Cron-Jobs

-1

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, Hellowenn 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!

laviex
quelle
1
-1 für den Aufruf ||einer "doppelten Pipe". Es ist eine logische 'oder' Operation und hat nichts mit Pipes zu tun.
Zitronenpresse

Antworten:

1

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)

  1. * cmd_group_1 * Ausführung fehlgeschlagen -> Der Beendigungscode ist nicht gleich Null
  2. * cmd_group_4 * wird ausgeführt

B)

  1. * cmd_group_1 *, * cmd_group_2 *, * cmd_group3 * Ausführungsdurchlauf
  2. * cmd_group_4 * wird NICHT ausgeführt

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 geschrieben

Karel Warchalowsky
quelle
1
Danke für deine ausführliche Antwort. Meine gewünschte Situation ist A. Wenn dies pgrepfehlschlä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.
Laviex
1
Ja, das ist eine sehr gute Idee. Also viel Glück
Karel Warchalowsky
-1

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.

* * * * * root /bin/true && echo true || echo false
* * * * * root /bin/false && echo true || echo false

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).

Benoit-Pierre DEMAINE
quelle