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".
cron
email
error-handling
garenne
la source
la source
Réponses:
Comme vous ne vous souciez pas de la sortie, vous pouvez rediriger le STDOUT d'un travail vers
/dev/null
et laisser le STDERR être envoyé par courrier (en utilisantMAILTO
la variable d'environnement).Ainsi, par exemple:
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
cron
travail.la source
La
chronic
commande de moreutils exécute une commande discrètement sauf si elle échoue.Citant son manuel:
la source
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 simplementcronic
, à condition que votrePATH
soit 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:
la source
cronic
liéchronic
ou est-ce juste une coïncidence?cronic
est implémenté en bash,chronic
comme suggéré dans la réponse précédente est un script Perl.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>&1
qui redirige STDERR vers STDOUT.Envoyez la sortie entière via la configuration par défaut de cron mailer:
Idem mais avec une adresse et un sujet précis:
Vous pouvez même effectuer plusieurs actions en cas d'erreur et ajouter à l'e-mail:
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.la source
$OUTPUT
entre guillemets:"$OUTPUT"
.Je n'y ai probablement pas pensé tout le long, mais
serait, dans des cas ordinaires, tout rediriger vers un fichier temporaire (que vous voudriez probablement utiliser
mktemp
pour obtenir un nom de fichier unique), supprimer cela si le fichier a réussi, puis àcat
nouveau 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.)
la source