Cron: ricevi solo errori nelle e-mail?


39

Alla fine ho impostato una pianificazione di backup realistica sui miei dati attraverso uno script di shell, che sono gestiti da cron a intervalli ravvicinati. Sfortunatamente, continuo a ricevere e-mail vuote ogni volta che CRON è stato eseguito e non solo quando le cose vanno male.

È possibile fare in modo che CRON invii e-mail solo quando qualcosa va storto, ad es. il mio TARnon viene eseguito come previsto?

Ecco come il mio crontab è configurato per il momento;

0 */2 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

Molte grazie!

Risposte:


54

Idealmente, lo script di backup non dovrebbe produrre nulla se tutto va come previsto e produce output solo quando qualcosa non va. Quindi utilizzare la variabile d'ambiente MAILTO per inviare qualsiasi output generato dallo script al proprio indirizzo e-mail.

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh

Se il tuo script normalmente produce output ma non ti interessa in cron, basta inviarlo a / dev / null e ti invierà un'email solo quando qualcosa è scritto su stderr.

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh > /dev/null

9
Questo non è l'ideale. Generalmente si desidera che l'intero output (stdout + stderr) venga inviato per e-mail quando il comando termina con un codice di errore diverso da zero. Altrimenti, è generalmente bene inghiottire almeno stdout. Per me, questo è un difetto di progettazione di cron.
Witiko,

3
@Witiko sono d'accordo; Ho trovato questa domanda cercando di risolverlo. Immagino che tu possa fare il tuo comando cron /bin/backup.sh > log_file || (echo Backup failed with exit status $?; cat log_file)?
Daniel H,

22

Usare lo script wrapper cronico sembra una buona idea; per usarlo non devi cambiare i tuoi script.

Invece di:

 0 1 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

fare:

 MAILTO=email@example.com
 0 1 * * * cronic /bin/backup.sh

In poche parole; rimarrà silenzioso se tutto procede senza intoppi (esci dallo stato 0), ma riporterà verbalmente in caso contrario e consentirà a cron di gestire la segnalazione della posta.

Maggiori informazioni su https://habilis.net/cronic/ .


Davvero non vedo come ciò possa aiutare quando il problema non è altro che una linea cron errata e cron sta facendo esattamente quello che gli viene detto di fare.
John Gardeniers,

3
@JohnGardeniers aiuta perché a volte hai un output senza errori.
Mikhail,

11
In alternativa, chronicdal moreutilspacchetto: joeyh.name/code/moreutils
Vladimir Panteleev

4

Stai specificatamente istruendo crondi inviare sempre e-mail, anche quando /bin/backup.sh(tra l'altro, dovrebbe esserci /usr/local/bin) ha successo. Ometti solo la | mail -s "Backup status" email@example.comparte e l' e-mail verrà inviata solo in caso di output. Probabilmente puoi (a seconda del tuo cron) impostare esplicitamente l'indirizzo e-mail su mail come assegnazione nel file crontab.

Per i dettagli, vedere

man 5 crontab

3

Si dovrebbe essere il regista del stderranmd non entrambi stdoute stderr.

1> /dev/nullNon usare 2>&1e dovrebbe andare bene. Inoltre, potrebbe essere necessario segnalare l'errore correttamente nello script di backup.


3

Ecco un'altra variante che ho usato con successo per molti anni: catturare l'output e stamparlo solo per errore , innescando una e-mail. Ciò non richiede file temporanei e conserva tutto l'output . La parte importante è quella 2>&1che reindirizza STDERR a STDOUT.

Invia l'intero output tramite la configurazione cron mailer predefinita:

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

Lo stesso ma con un indirizzo e un soggetto specifici:

(l'indirizzo può anche essere modificato impostando MAILTO = xxxx per l'intero file crontab)

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" an@email.address

Puoi anche eseguire più azioni in caso di errore e aggiungere all'email:

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

Funzionerà con comandi semplici. Se hai a che fare con pipe complesse ( find / -type f | grep -v bla | tar something-or-other), allora è meglio spostare il comando in uno script ed eseguire lo script usando l'approccio sopra menzionato. Il motivo è che se qualsiasi parte del tubo viene inviata a STDERR, riceverai comunque e-mail.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.