Wie kann ich wissen, wann ein Cron-Job getötet wurde oder abgestürzt ist?

7

Wenn ein Cron-Job abstürzt, bleiben normalerweise einige Fehlermeldungen im Protokoll.

Wir führen ein Shell-Skript und ein Java-Programm mit Cron-Job aus. Kürzlich haben wir etwas Seltsames aus dem Protokoll herausgefunden. Offensichtlich ist das Programm entweder abgestürzt oder beendet worden, weil es eine Programmsperre gibt, die wir beim Initialisieren des Programms festgelegt haben und die nicht freigegeben wurde. Wir vermuten, dass das Programm beendet wurde, weil das Protokoll des Programms die Zielmeldung nicht zeigte.

Wer kann den Job möglicherweise beenden und wie kann ich per E-Mail benachrichtigt werden, wenn ein Cron-Job tot ist?

BEARBEITEN: Ich möchte nicht, dass die Crontab-Methode E-Mails empfängt, da nur jede Standardausgabe an die E-Mail gesendet wird. In meinem Fall gibt es viele andere Systemausgaben von anderen Programmen, da einige von ihnen nicht log4j verwenden oder von einem Shell-Skript wiedergegeben werden. Da das System viele Benutzer enthält, können nicht alle Benutzer die Standardausgabe ihres Programms verwalten.

lamwaiman1988
quelle

Antworten:

6

Um dies zu debuggen, können Sie setzen

set -e -u

am oberen Rand Ihres Shell-Skripts - es endet dann mit einem Fehler-Exit-Status, wenn ein Befehl fehlschlägt oder eine undefinierte Variable verwendet wird.

Dann können Sie vom Cron-Job ein Wrapper-Skript aufrufen, das das Hauptskript wie folgt aufruft

sh -x main_script.sh || echo Failed with exit status: $?

Mit -xjeder Zeile ausgedruckt wird , bevor sie ausgeführt wird. Die Ausgabe wird vom Cron-Daemon an Sie gesendet.

Sie können auch eine temporäre Datei verwenden, wenn die Ausgabe zu groß ist:

sh -x main_script.sh > $TEMPFILE 2>&1
if [ $? -ne 0 ]; then echo Failed with exit status $? - see $TEMPFILE; fi

> 128Wenn der Exit-Status der Befehl ist, wurde der Befehl durch ein Signal unterbrochen - z. B. wurde er von jemandem "getötet", es ist ein Segmentierungsfehler aufgetreten oder es gab eine Situation mit zu wenig Speicher ( wie das Signal aus dem Exit-Status abgerufen wird ).

maxschlepzig
quelle
6

Überprüfen Sie Ihre Systemprotokolle. Welche Protokolle überprüft werden müssen, hängt von Ihrer Installation ab. Unter Debian mit der Standardeinstellung erhalten Sie:

  • in /var/log/auth.log, Hinweise ab dem Beginn und dem Ende des Cron-Jobs, da der Job eine PAM-Sitzung beinhaltete;
  • in /var/log/syslog, ein Hinweis, dass grandchild #32283 failed with exit status 1.
  • ein zusätzlicher Hinweis, /var/log/kern.logwenn Ihr Prozess vom OOM-Killer beendet wurde.

Sie erhalten E-Mails von cron, wenn Ihr cron-Job eine Ausgabe der Standardausgabe oder einen Standardfehler erzeugt (es sei denn, Ihr lokales E-Mail-Zustellsystem ist nicht ordnungsgemäß eingerichtet). Sie erhalten keine E-Mail, wenn sie stillschweigend einen Status ungleich Null zurückgibt (einschließlich des Falls, durch ein Signal getötet zu werden). Wenn Sie eine Benachrichtigung wünschen, arrangieren Sie einen Shell-Wrapper, der im Fehlerfall laut ist, z

42 1 * * * /path/to/real/job || echo $?

Wenn Sie weitere Informationen zu Prozessen und deren Tod (und wie sie geboren werden, aber hier wissen Sie bereits) protokollieren möchten, finden Sie unter Gibt es ein Protokoll vergangener Threads, die jetzt geschlossen sind?

Gilles 'SO - hör auf böse zu sein'
quelle
@sourcejedi Ich bin nicht sicher, ob ich Ihren Kommentar verstehe. Wenn Sie sich fragen, wann Sie möglicherweise keine Nachricht von einer Shell erhalten, wenn ein Programm von einem Cron-Job beendet wird, gibt es zwei häufige Fälle: 1. Die Shell selbst wird beendet, bevor sie Zeit zum Drucken hat. 2. Der Cron-Job führt nur eine ausführbare Datei aus, und die Shell führt sie aus. Es gibt also keine Shell, die etwas druckt, wenn der Prozess der ausführbaren Datei beendet wird.
Gilles 'SO - hör auf böse zu sein'
Ich verstehe, dass Sie für sh-kompatible Shells niemals || echo $?Abstürze / Kills gemäß der Frage erkennen müssten , nur um Nicht-Signal-Exits zu erkennen, die still sind, aber EXIT_SUCCESS (0) nicht zurückgeben. Letztere sind ungewöhnlich, da sie auch nicht angezeigt werden, wenn Sie den Befehl über eine interaktive Shell ausgeführt haben. (Könnte nützlich sein, um nach seltsamen Java-Programmen oder etwas anderem zu suchen).
Sourcejedi
1
@sourcejedi Wenn Sie nur /path/to/myprogramden Job haben und die Shell die allgemeine Optimierung des Befehls "Ausführen des letzten Befehls" implementiert und das Programm aufgrund eines Signals stirbt, wird keine Nachricht gedruckt. Die einzige Spur des Todes ist die Benachrichtigung von cron, die den Beendigungsstatus des Programms enthält.
Gilles 'SO - hör auf böse zu sein'
Schmerzen. Ich habe effektiv getestet echo "sleep 10" | bash. Es stellt sich heraus, dass sich dies anders verhält als beides bash -c 'sleep "10"'- was ich hätte testen sollen - und zB echo "sleep 10" | dashwas ich auch hätte testen sollen.
Sourcejedi