Avoir une sortie de courrier électronique cron vers MAILTO en fonction du statut de sortie

11

J'ai un travail cron exécutant une commande php comme ceci:

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

Cela ne devrait envoyer que la sortie STDERR à l'adresse MAILTO. D'après ce que je comprends, le script php ne génère aucune information STDERR même lorsque son état de sortie est 1.

Comment puis-je obtenir la sortie de la commande php (STDOUT) et l'envoyer à MAILTO uniquement si l'état de sortie est différent de zéro?

Dave
la source

Réponses:

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

qui vide la sortie standard dans logfileet ne la sort que si le script échoue (quitte non nul).

Remarque: si votre script peut également sortir vers, stderrvous devez rediriger stderrvers stdout. Sinon, tout ce qui est imprimé stderrentraînera l'envoi par cron d'un e-mail même si le code de sortie est 0:

php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile
Kyle Jones
la source
Cela supprimera également tout ce qui apparaît dans stderr, ce qui ne signifie pas nécessairement qu'il y a une erreur (par exemple, une sortie de débogage).
hoffmanc
3

Avez-vous considéré la chronique des moreutils . Je pense qu'il fait exactement ce que vous voulez:

chronique exécute une commande et fait en sorte que sa sortie standard et son erreur standard ne s'affichent qu'en cas d'échec de la commande (quitte à zéro ou se bloque). Si la commande réussit, toute sortie étrangère sera masquée.

Dans les versions récentes, il y a un -ecommutateur pour afficher également la sortie complète si quelque chose a été écrit sur stderr.

saraedum
la source
2

Puisque la sortie est générée avant que l'état de sortie ne soit connu, vous devrez la stocker quelque part.

Une possibilité est de le stocker dans une variable shell:

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

Cela ne préserve pas complètement la sortie du script (il supprime les lignes vides de fin), mais c'est correct pour ce cas d'utilisation. Si vous souhaitez conserver les lignes vides de fin:

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

S'il y a potentiellement beaucoup de sortie, vous préférerez peut-être le stocker dans un fichier temporaire à la place:

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- arrête d'être méchant'
la source