7 votes

Cronjob stderr vers un fichier et un courrier électronique

J'ai besoin que mes cronjobs continuent à produire des erreurs dans certains fichiers, mais je veux aussi qu'ils soient envoyés par e-mail en même temps. Cela ne semble pas possible sans quelques astuces.

J'ai trouvé este mais ne m'a pas aidé.

Quelle serait la manière la plus simple de procéder ?

8voto

Stefan Lasiewski Points 22459

Si je comprends bien votre question, vous souhaitez envoyer les erreurs (et non la sortie) dans un fichier journal et les envoyer également par courrier électronique.

Pour ce faire, utilisez une combinaison de tee et la redirection stdout/stderr.

Selon la cron(8) cron peut se charger de l'envoi du courrier électronique pour vous. Il n'est pas nécessaire de dupliquer cet effort inutilement.

Lors de l'exécution des commandes, toute sortie est envoyée au propriétaire de la crontab (ou à l'utilisateur nommé dans la variable d'environnement MAILTO de la crontab, si elle existe).

L'astuce consiste à envoyer STDERR à un fichier journal et au courrier électronique, mais pas STDOUT. L'exemple suivant montre comment procéder.

Supposons que mon script exécute la commande suivante. ls tmp/foo est réussie, cette sortie est donc envoyée à STDOUT. ls tmp/bar génère une erreur, de sorte que cette sortie est envoyée à STDERR.

$ ls tmp/foo tmp/bar
ls: tmp/bar: No such file or directory
tmp/foo

Le job cron suivant cachera tout STDOUT, mais redirigera STDERR vers /var/log/test.log

* * * * * ls tmp/foo tmp/bar 2>&1 >/dev/null | tee -a $HOME/var/log/test.log

Voici les résultats. L'email et ~/var/log/test.log diront tous deux la même chose.

Le corps de l'e-mail indique :

ls: tmp/bar: No such file or directory

Le fichier journal indique la même chose :

$ cat ~/var/log/test.log
ls: tmp/bar: No such file or directory

En prime, il est également possible d'envoyer STDERR et STDOUT dans un fichier journal (que vous ne consultez qu'occasionnellement), mais d'envoyer STDERR à l'écran (s'il est exécuté à la main) ou par courrier électronique (s'il est exécuté à partir d'un cron). J'utilise l'extrait suivant pour les scripts de construction de longue durée.

{ { ./configure && make && make install ; } >> $LOGFILE ; } 2>&1 | tee -a $LOGFILE

2voto

Eddie Points 4270

Utilisation tee :

MBPro-ABustardo:~ abustardo$ echo foo |tee tmp  
foo

MBPro-ABustardo:~ abustardo$ cat tmp  
foo

dans votre cas :

[your script] 2>&1 |tee [some local local file] |mail -s [subject] foo@example.com

0voto

sreimer Points 2148

Cela répond-il à votre question ? https://stackoverflow.com/questions/1396506/cron-send-email-with-stderr-but-not-stdout

Cron est censé envoyer un courrier électronique après chaque exécution, à moins qu'il ne soit dirigé vers /dev/null

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X