Lassen Sie Cron-E-Mails basierend auf dem Exit-Status an MAILTO ausgeben

11

Ich habe einen Cron-Job, der einen PHP-Befehl wie diesen ausführt:

php /path/to/script.php > dev/null

Dies sollte nur die STDERR-Ausgabe an die MAILTO-Adresse senden. Soweit ich weiß, gibt das PHP-Skript keine STDERR-Informationen aus, selbst wenn der Exit-Status 1 ist.

Wie kann ich die Ausgabe des PHP-Befehls (STDOUT) abrufen und nur an MAILTO senden, wenn der Exit-Status ungleich Null ist?

Dave
quelle

Antworten:

12
php /path/to/script.php > logfile || cat logfile; rm logfile

Hiermit wird die Standardausgabe ausgegeben logfileund nur ausgegeben , wenn das Skript fehlschlägt (Exits ungleich Null).

Hinweis: Wenn Ihr Skript könnte auch Ausgabe stderrdann sollten Sie umleiten stderrzu stdout. Andernfalls stderrsendet alles, was gedruckt wurde, dazu, dass cron eine E-Mail sendet, selbst wenn der Beendigungscode 0 ist:

php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile
Kyle Jones
quelle
Dies gilt auch für alles, was in stderr angezeigt wird, was nicht unbedingt bedeutet, dass ein Fehler vorliegt (z. B. Debug-Ausgabe).
Hoffmanc
3

Haben Sie chronisch von moreutils betrachtet . Ich denke, es macht genau das, was Sie wollen:

chronisch führt einen Befehl aus und sorgt dafür, dass sein Standardausgang und sein Standardfehler nur angezeigt werden, wenn der Befehl fehlschlägt (wird ungleich Null beendet oder stürzt ab). Wenn der Befehl erfolgreich ist, werden alle externen Ausgaben ausgeblendet.

In den letzten Überprüfungen gibt es einen -eSchalter, der auch die vollständige Ausgabe anzeigt, wenn etwas in stderr geschrieben wurde.

saraedum
quelle
2

Da die Ausgabe generiert wird, bevor der Exit-Status bekannt ist, müssen Sie sie irgendwo speichern.

Eine Möglichkeit besteht darin, es in einer Shell-Variablen zu speichern:

output=$(php /path/to/script.php)
if [ $? -ne 0 ]; then
  printf "%s\n" "$output"
fi

Dadurch wird die Ausgabe des Skripts nicht vollständig beibehalten (nachgestellte Leerzeilen werden entfernt), aber für diesen Anwendungsfall ist dies in Ordnung. Wenn Sie nachgestellte Leerzeilen beibehalten möchten:

output=$(php /path/to/script.php; ret=$?; echo a; exit $ret)
if [ $? -ne 0 ]; then
  printf "%s" "${output%a}"
fi

Wenn möglicherweise viel ausgegeben wird, möchten Sie diese möglicherweise lieber in einer temporären Datei speichern:

output_file=$(mktemp /var/tmp/script.XXXXXXXXXX.out)
php /path/to/script.php >>"$output_file"
ret=$?
if [ $ret -ne 0 ]; then
  echo "script.php failed (status $ret), see the output in $output_file"
fi
Gilles 'SO - hör auf böse zu sein'
quelle