web-dev-qa-db-fra.com

Cron: obtenir uniquement des erreurs dans les e-mails?

J'ai finalement mis en place un calendrier de sauvegarde réaliste sur mes données via un script Shell, qui sont gérés par cron à intervalles serrés. Malheureusement, je reçois toujours des e-mails vides à chaque exécution du CRON et pas seulement lorsque les choses tournent mal.

Est-il possible de faire envoyer des courriels à CRON uniquement en cas de problème, c.-à-d. mon TAR ne s'exécute pas comme prévu?

Voici comment mon crontab est configuré pour le moment;

0 */2 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" [email protected]

Merci beaucoup!

39
Industrial

Idéalement, vous voudriez que votre script de sauvegarde ne produise rien si tout se passe comme prévu et ne produise une sortie qu'en cas de problème. Utilisez ensuite la variable d'environnement MAILTO pour envoyer toute sortie générée par votre script à votre adresse e-mail.

[email protected]
0 */2 * * * /bin/backup.sh

Si votre script produit normalement une sortie mais que vous ne vous en souciez pas dans cron, envoyez-le simplement à/dev/null et il vous enverra un e-mail uniquement lorsque quelque chose est écrit sur stderr.

[email protected]
0 */2 * * * /bin/backup.sh > /dev/null
56
Cakemox

Utiliser cronic le script wrapper semble être une bonne idée; pour l'utiliser, vous n'avez pas besoin de modifier vos scripts.

Au lieu de:

 0 1 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" [email protected]

faire:

 [email protected]
 0 1 * * * cronic /bin/backup.sh

Tout simplement; il fonctionnera en silence si tout se passe bien (quitter l'état 0), mais il rendra compte verbalement sinon, et laissera cron gérer les rapports de messagerie.

Plus d'informations sur https://habilis.net/cronic/ .

25
Ricardo Pardini

Vous demandez spécifiquement à cron de toujours envoyer des e-mails, même lorsque /bin/backup.sh (soit dit en passant, il devrait être dans /usr/local/bin) réussit. Oubliez simplement le | mail -s "Backup status" [email protected] la partie et l'e-mail ne seront envoyés qu'en sortie. Vous pouvez probablement (en fonction de votre cron) définir explicitement l'adresse e-mail à laquelle envoyer un e-mail comme affectation dans le fichier crontab.

Pour plus de détails, voir

man 5 crontab
4
reinierpost

Vous devez diriger le stderr et pas les deux stdout et stderr.

Utilisez 1> /dev/null Et non 2>&1 Et ça devrait aller. En outre, vous devrez peut-être signaler l'erreur correctement dans votre script de sauvegarde.

3
Khaled

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 , déclenchant un e-mail. Cela ne nécessite aucun fichier temporaire et préserve toutes les sorties . La partie importante est le 2>&1 qui 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:

(l'adresse peut également être modifiée en définissant MAILTO = xxxx pour l'ensemble du fichier crontab)

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), il vaut mieux déplacer la commande dans un script et exécuter le script en utilisant l'approche susmentionnée. La raison en est que si une partie du canal sort vers STDERR, vous recevrez toujours des e-mails.

3
Akom