Avere l'output e-mail cron su MAILTO in base allo stato di uscita


11

Ho un lavoro cron che esegue un comando php come questo:

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

Questo dovrebbe inviare solo l'output STDERR all'indirizzo MAILTO. Da quello che raccolgo lo script php non sta producendo alcuna informazione STDERR anche quando il suo stato di uscita è 1.

Come posso ottenere l'output del comando php (STDOUT) e inviarlo a MAILTO solo se lo stato di uscita è diverso da zero?

Risposte:


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

che scarica l'output standard logfilee lo emette solo se lo script ha esito negativo (esce da zero).

Nota: se il tuo script potrebbe anche essere inviato a, stderrallora dovresti reindirizzare stderra stdout. Altrimenti, qualsiasi cosa stampata stderrfarà sì che cron invii un'email anche se il codice di uscita è 0:

php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile

Questo eliminerà anche tutto ciò che appare in stderr, il che non significa necessariamente che ci sia un errore (ad esempio, output di debug).
Hoffmanc,

3

Hai considerato cronico da moreutils . Penso che faccia esattamente quello che vuoi:

cronico esegue un comando e organizza la visualizzazione dell'errore standard e dell'errore standard solo se il comando fallisce (esce da zero o va in crash). Se il comando ha esito positivo, qualsiasi output estraneo verrà nascosto.

Nelle recenti verifiche, c'è un -einterruttore per mostrare anche l'output completo se qualcosa è stato scritto su stderr.


2

Poiché l'output viene generato prima che lo stato di uscita sia noto, è necessario memorizzarlo da qualche parte.

Una possibilità è di memorizzarlo in una variabile shell:

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

Questo non preserva completamente l'output dello script (rimuove le righe vuote finali), ma va bene per questo caso d'uso. Se si desidera conservare le righe vuote finali:

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

Se c'è potenzialmente molto output, potresti preferire invece memorizzarlo in un file temporaneo:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.