Désactiver les e-mails cron sauf s'il y a des erreurs?

12

Comment puis-je recevoir des e-mails de cron uniquement en cas d'erreur?

Dans la très grande majorité des cas, les tâches se dérouleront très bien - et je ne me soucie vraiment pas du résultat.

Ce n'est que dans les rares cas d'échec que je veux / dois savoir.

J'ai procmail disponible - mais je ne sais pas si ce que je décris est possible de gérer en externe pour cron "correctement".

garenne
la source
Et si crond lui-même ne fonctionne pas? Ou la machine est hors ligne? C'est pourquoi je ne me soucie jamais des e-mails de cron et utilise un service de surveillance cron dédié. J'ai un faible pour WDT.io et le recommande.
Christian Pekeler

Réponses:

8

Comme vous ne vous souciez pas de la sortie, vous pouvez rediriger le STDOUT d'un travail vers /dev/nullet laisser le STDERR être envoyé par courrier (en utilisant MAILTOla variable d'environnement).

Ainsi, par exemple:

...
...
[email protected]
...
...
* * * * * /my/script.sh >/dev/null

enverra du courrier lorsqu'il n'y a de sortie que sur STDERR (avec le STDERR), et rejettera le STDOUT.

Cela suppose bien sûr que lorsqu'un programme a écrit sur STDERR, a échoué; ce n'est pas toujours le cas. Si vous contrôlez le programme, vous pouvez le faire. Pour tout cas complexe, vous devez écrire un wrapper d'une sorte qui exécute la ou les commandes et envoyer le courrier en conséquence. Et mettez l'emballage comme crontravail.

heemayl
la source
1
L'inconvénient de cette approche est qu'en cas d'échec, vous n'obtenez que la sortie STDERR, ce qui peut rendre le diagnostic plus difficile que si vous aviez la sortie complète.
plugwash
11

La chroniccommande de moreutils exécute une commande discrètement sauf si elle échoue.

Citant son manuel:

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.

Une utilisation courante pour chronique est d'exécuter un travail cron. Plutôt que d'essayer de garder la commande silencieuse, et d'avoir à traiter les courriers contenant une sortie accidentelle quand elle réussit, et pas assez verbeux en cas d'échec, vous pouvez simplement l'exécuter de manière verbeuse toujours, et utiliser chronique pour masquer la sortie réussie.

Michał Politowski
la source
8

Comment puis-je recevoir des e-mails de cron uniquement en cas d'erreur?

Vous pouvez encapsuler vos invocations cron avec cronic , un script shell qui mange la sortie cron à moins que le code retour du processus invoqué ne soit différent de zéro ou qu'il y ait une sortie d'erreur sans trace.

Pour utiliser cronic, téléchargez le script à un emplacement approprié, tel que /usr/local/bin. Vos entrées crontab doivent être préfixées avec le chemin d'accès au script (par exemple /usr/local/bin/cronic), ou simplement cronic, à condition que votre PATHsoit correctement défini.

Notez que les «erreurs» sont un terme mal défini dans votre question et nécessitent une définition précise. Pour que cronic soit utile, vous devez vous assurer que les travaux que vous encapsulez avec cronic signalent des erreurs de l'une des manières qui définissent une condition d'erreur. Les méthodes implicites de génération de rapports, telles que l'écriture de chaînes de texte STDOUT, nécessiteront une réflexion approfondie pour la rendre compatible avec cronic ou un autre mécanisme de génération de rapports cron.

D'autres emballages sont disponibles, comme liés depuis le site cronic:

Ossifrage cosmique
la source
1
Est-ce croniclié chronicou est-ce juste une coïncidence?
Toby Speight
@TobySpeight Coincidence semble-t-il. cronicest implémenté en bash, chroniccomme suggéré dans la réponse précédente est un script Perl.
Cosmic Ossifrage
4

Voici une autre variante que j'ai utilisée avec succès depuis de nombreuses années - capturer la sortie et l'imprimer uniquement en cas d'erreur . Cela ne nécessite aucun fichier temporaire et préserve toutes les sorties . La partie importante est celle 2>&1qui redirige STDERR vers STDOUT.

Envoyez la sortie entière via la configuration par défaut de cron mailer:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"

Idem mais avec une adresse et un sujet précis:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" [email protected]

Vous pouvez même effectuer plusieurs actions en cas d'erreur et ajouter à l'e-mail:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || {echo "$OUTPUT" ; ls -ltr /backup/dir ; }

Cela fonctionnera pour les commandes simples. Si vous avez affaire à des tuyaux complexes ( find / -type f | grep -v bla | tar something-or-other), vous feriez mieux de déplacer la commande dans un script et d'exécuter le script en utilisant l'approche susmentionnée. La raison en est que si une partie du tuyau sort vers STDERR, vous recevrez toujours des e-mails.

Akom
la source
Vous devriez mettre $OUTPUTentre guillemets: "$OUTPUT".
G-Man dit `` Réintègre Monica ''
@ G-Man Fair point, il y a toujours une chance que la sortie contienne "-n" ou quelque chose de similaire.
Akom
0

Je n'y ai probablement pas pensé tout le long, mais

* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null

serait, dans des cas ordinaires, tout rediriger vers un fichier temporaire (que vous voudriez probablement utiliser mktemppour obtenir un nom de fichier unique), supprimer cela si le fichier a réussi, puis à catnouveau le contenu, s'il existe toujours (c'est-à-dire que yourthing.sh a quitté avec condition d'erreur), à retirer par l'expéditeur cron.

Si la mémoire est bonne, cron n'envoie déjà rien s'il n'y a pas eu de sortie, donc si le fichier journal est vide ou n'existe pas, rien ne se passe. (Nous redirigeons le message d'erreur.)

Ulrich Schwarz
la source