2009-09-08 12 views
18

Ho alcuni script Python che vengono eseguiti su base giornaliera in cron. Come posso avere cron mandami una email SOLO QUANDO C'È STDERR OUTPUT dal mio script? Voglio poter inviare più destinatari e impostare la riga dell'oggetto singolarmente per ogni voce di cron.Cron invia email con STDERR ma NON STDOUT?

ho provato questo:

./prog > /dev/null | mail . . . 

ma non ha funzionato - ho ancora ricevere messaggi di posta elettronica vuote quando non c'è STDERR. Devo farlo nello script stesso?

Scusate se questo sembra semplice, ho cercato su Google molto ma non riesco a trovare questa risposta succintamente.

risposta

8

Il test del file -s indica se esiste un file e ha dimensioni superiori a zero.

./prog >/dev/null 2>some/file ; if [ -s some/file ] ; then mail < some/file ; fi 
+0

Ho finito per utilizzare una variante di questo approccio. Grazie mobrule – g33kz0r

+0

trovato un buon articolo su questo che mi ha aiutato .. http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/ – ishan

23

Per cron non è necessario passare attraverso la posta. Il demone cron invierà automaticamente qualsiasi output del tuo comando a te. L'immissione crontab dovrebbe assomigliare:

# every minute 
* * * * * ./prog >/dev/null 

Se non v'è alcuna uscita STDERR, non sarà possibile ottenere tutta la posta.

+1

"Se non c'è uscita STDERR, non riceverai alcuna posta". Questo è vero, se imposto MAILTO = "me @ mio". Tuttavia, NON è vero se piping per mail (1). "Oltre a LOGNAME, HOME e SHELL, cron guarderà a MAILTO se ha qualche motivo per inviare posta come risultato dell'esecuzione di comandi in' questo 'crontab. " - http://ss64.com/osx/crontab.html Tuttavia, ho bisogno di impostare il _subject_ della posta, e non c'è modo di farlo (IMHO) con cron stesso. Quindi sono bloccato usando la posta, che ci riporta alla mia domanda iniziale. – g33kz0r

+1

Il problema con questo approccio è che presuppone che 'stdout' non conterrà alcuna informazione utile in caso di errore.La soluzione 'cronic' ha funzionato meglio per me. –

12

posta v1.6 ha la possibilità di non inviare i messaggi con un corpo vuoto:

-E  Do not send messages with an empty body. 
     This is useful for piping errors from cron(8) scripts. 

Questo potrebbe essere quello che state cercando.

15

Stai facendo la domanda sbagliata. Quando si utilizza mail (1) per inviare l'e-mail, non è più rilevante il suo in cron. Quello di cui hai realmente bisogno è il pipe stderr per lo stdin della posta. Tubo Normale è da stdout a stdin, in modo modo più semplice per risolvere questo è reindirizzare:

{ /prog > /dev/null ; } 2>&1 | mail ...

O nel modo meno chiaro, perché l'ordine confuso di redirectings:

/prog 2>&1 > /dev/null | mail ...

+1

Ottima risposta e la tecnica corretta per dirigere sia stderr che stdout al comando mail. Il secondo esempio rilascia lo stdout sul pavimento e invia solo stderr al comando mail. –

+0

Penso che sia stato l'intento. –

8

Ci è un bel strumento chiamato cronic che fa questo. Fa parte del pacchetto moreutils.

+2

Sulla mia Ubuntu 12.04, è '' chronic'' (non '' cronic'') che è in bundle in '' moreutils'', è scritto in perl piuttosto che bash, ma sembra avere lo stesso scopo. Grazie comunque ! – vaab

+1

'chronic' sembra emettere sia STDOUT che STDERR se il programma si chiude con un errore, o neanche se il programma esce in modo pulito. Non ha funzionato per me. Volevo un 'cronico' che filtra STDOUT, indipendentemente dal codice di uscita. Un semplice reindirizzamento ha funzionato meglio per me. – richardkmiller

+1

Si noti che il comportamento di 'cronic' e' chronic' è diverso: 'chronic' (' moreutils', Perl) non produce nulla se il codice di uscita è 0, anche se c'era qualcosa su STDERR. 'cronic' ([habilis.net] (http://habilis.net/cronic/), bash) restituisce tutto se c'era qualcosa su STDERR, anche se il codice di uscita è 0. – Qtax

-2

Se lo SCRIPT ha comandi che possono produrre STDERR a cui si desidera essere notificati, è necessario utilizzare una chiamata di posta o mailx all'interno dello script stesso (se in seguito o). Il processo cron Reindirizzamenti STDOUT e STDERR sono SOLO per cron job ESECUZIONE STDOUT e STDERR. hkmaly l'aveva proprio sul n

+3

allora perché non rispondi alle risposte di hkmalys ? questo non aggiunge nulla – g33kz0r