Come ottenere e-mail da cron-job (non riusciti) in Ubuntu?


45

Creo cron-lavori in Ubuntu inserendo l'eseguibile in uno dei /etc/cron.{daily,hourly,monthly,weekly}. Ci sono molte directory che iniziano con cron:

kent@rat:~$ ls -ld /etc/cron*
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.d
drwxr-xr-x 2 root root 4096 2009-07-16 13:17 /etc/cron.daily
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.monthly
-rw-r--r-- 1 root root  724 2009-05-16 23:49 /etc/crontab
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.weekly

Vorrei ricevere e-mail dai miei script quando:

  1. Uno script ha esito negativo e fornisce un codice di uscita diverso da zero.
  2. La sceneggiatura ha qualcosa da dirmi

Ho SSMTP installato e funzionante, invio la mia posta dal mio account Google. Il fatto che SSMTP possa inviare posta utilizzando un solo account non è un problema per me. È solo un server di casa e gli utenti che ho non hanno la possibilità di aggiungere cron-lavori.

Mi piacerebbe sapere come funziona l'invio da script di solito in Linux / Unix in generale e in Ubuntu in particolare. Vorrei anche sapere un buon modo per me di ricevere mail nelle due situazioni precedenti.

Risposte:


60

Per impostazione predefinita, cron invierà un'email al proprietario dell'account con cui è in esecuzione crontab.

Il crontab a livello di sistema è in / etc / crontab viene eseguito sotto l'utente `root '

Poiché root è ampiamente utilizzato, ti consiglio di aggiungere comunque un alias root al tuo file / etc / aliases. (esegui "newaliases" dopo)

Il modo normale di strutturare questo è che root sia aliasato a un altro utente sul sistema, ad esempio per me alias "root" a "phil" (il mio account utente) e alias "phil" al mio indirizzo di posta elettronica esterno.

Se si dispone di un cron utente specifico che si desidera inviare via e-mail in uscita, è possibile utilizzare di nuovo / etc / alias (fornendo l'accesso superutente) per reindirizzare l'utente a un altro indirizzo e-mail, oppure è possibile utilizzare quanto segue in top del tuo crontab:

MAILTO="email@domain.com"

Se la posta deve essere inviata a un utente locale, puoi invece inserire solo il nome utente:

MAILTO=someuser

Se hai bisogno di maggiori informazioni vedi crontab (5) eseguendo:

man 5 crontab

Le /etc/aliasesvoci non dovrebbero seguire il formato name: value1, value2, ... ? Non lo so, forse il formato è stato cambiato ad un certo punto negli ultimi 8 anni.
Nathan Jones,

1
"per me alias 'root' a 'phil' (il mio account utente) e alias 'phil' al mio indirizzo email esterno." Come alias "phil" a un indirizzo email esterno?
Howard Lee,

29

Per ricevere email da vixie cron avrai bisogno di qualcosa che replica il comando sendmail. Quindi l'installazione di postfix o SSMTP risolverà questa parte. Se si utilizza postfix, è possibile utilizzare il file alias per mappare gli utenti del sistema su indirizzi e-mail reali.

L'aggiunta di MAILTO = "foo@bar.com" all'inizio di un crontab provocherà l'invio tramite e-mail di qualsiasi output dal processo cron. Questo è indipendentemente dal codice di errore.

Per gli script che generano correttamente errori in STDERR, è facile ricevere un'e-mail solo quando vanno male:

MAILTO="foo@bar.com"
0 5 * * * /bin/some_script > /dev/null

Questo reindirizzerà solo lo STDOUT su null. Se sono presenti messaggi STDERR, riceveranno e-mail.

Tuttavia, ho scoperto che alcuni script generano errori in modo errato come STDOUT e impostano il codice di uscita su 1. Non ho trovato un modo per catturare l'output da questi, ma ignoro l'output se il codice di uscita è 0. L'unico metodo Mi viene in mente di reindirizzare l'output su un file, quindi se il codice di uscita non è 0 output quel file per cron da afferrare. Sembra piuttosto orribile però.


3
Potrebbe provare habilis.net/cronic
dfrankow il

8

Se si desidera inviare tutto l'output (stdout e stderr) a un indirizzo specifico, è possibile utilizzare la MAILTOvariabile. Ad esempio, posizionare quanto segue nella parte superiore dello script.

MAILTO="address@example.com"

5

prova ad aggiungere "root: your@email.address" a / etc / aliases

che invierà tutti i messaggi per quell'utente alla tua email. se non vuoi tutti i messaggi, puoi creare un utente appositamente per questo.

Finché lo script emette qualcosa, riceverai una mail.



2

Non credo che SSMTP sia all'altezza di ciò di cui hai bisogno. Hai bisogno di qualcosa che possa "ricevere" posta dai processi cron e poi inviarla alla tua vera casella di posta.

Uso Sendmail, ma è perché sono una vecchia mano di Sun; So che in questi giorni viene deriso da tutti i ragazzi fantastici che usano Postfix. La tua comunità Ubuntu può guidarti nella configurazione del tuo sistema di posta.


ssmtp implementa / bin / sendmail
bobpaul

2

Un'alternativa: archivio tutta la posta radice in alcuni file, quindi elimino la posta originale.

I cron uno script (ecco la parte chiave) -

#!/bin/bash
if `/usr/bin/mail -e`; then
   /usr/bin/mail --print 2>&1 > /tmp/email_${date +"%Y-%m-%d_%H.%M").log
   echo ‘d *’ | /usr/bin/mail -N > /dev/null
fi
exit 0

Questo mantiene le cose in ordine e posso tenerle d'occhio. Potrei inviare via email un file di posta giornaliero a un ID di posta elettronica esterno, ecc ...

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.