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!
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
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/ .
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
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.
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.
1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"
(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]
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.