sviluppo-web-qa.it

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

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:

[email protected]:~$ 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 il mailing 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.

46
Deleted

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 per strutturare questo è che root sia aliasato a un altro utente sul sistema, ad es. per me alias "root" a "phil" (il mio account utente) e alias "phil" al mio indirizzo email 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 protected]"

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
62
Philip Reynolds

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 = "[email protected]" 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="[email protected]"
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ò.

29
Theozaurus

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

MAILTO="[email protected]"
8
Dan Carley

prova ad aggiungere "root: [email protected]" 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.

5
Daniel P

Su tutti i miei server di produzione che in genere eseguono circa 20 cronjobs ogni giorno lo giuro sul pacchetto python-cronwrap. Dai un'occhiata qui: http://pypi.python.org/pypi/cronwrap . È davvero facile da configurare e soprattutto affidabile.

3
Low Kian Seong

Non penso 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.

2
David Mackintosh

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 ...

2
irdroid3