cron
invia già l'output standard e l'errore standard di ogni processo che esegue per posta al proprietario del processo cron.
È possibile utilizzare MAILTO=recipient
nel crontab
file per inviare le e-mail a un altro account.
Affinché ciò funzioni, è necessario che la posta funzioni correttamente. Il recapito a una casella di posta locale di solito non è un problema (in effetti, è probabile che ls -l "$MAIL"
ti accorga che ne hai già ricevuto qualcuno), ma per ottenerlo fuori dalla scatola e su Internet richiede l'MTA (Postfix, Sendmail, che cosa hai) per essere correttamente configurato per connettersi al mondo.
Se non viene generato alcun output, non verrà generata alcuna e-mail.
Una disposizione comune è il reindirizzamento dell'output su un file, nel qual caso ovviamente il demone cron non vedrà il lavoro restituire alcun output. Una variante è reindirizzare l'output standard su un file (o scrivere lo script in modo che non stampi mai nulla - forse memorizza invece i risultati in un database o esegue attività di manutenzione che semplicemente non generano nulla?) E riceve un'e-mail solo se presente è un messaggio di errore.
Per reindirizzare entrambi i flussi di output, la sintassi è
42 17 * * * script >>stdout.log 2>>stderr.log
Notate come aggiungiamo (doppio >>
) invece di sovrascrivere, in modo che l'output di qualsiasi lavoro precedente non venga sostituito dal successivo.
Come suggerito in molte risposte qui, è possibile inviare entrambi i flussi di output a un singolo file; sostituire il secondo reindirizzamento con 2>&1
per dire "l'errore standard dovrebbe andare ovunque stia andando l'output standard". (Ma non approvo in modo particolare questa pratica. Ha senso soprattutto se non ti aspetti davvero qualcosa dall'output standard, ma potresti aver trascurato qualcosa, forse proveniente da uno strumento esterno chiamato dal tuo script.)
cron
i lavori vengono eseguiti nella directory principale, quindi i nomi di file relativi devono essere relativi a quello. Se vuoi scrivere al di fuori della tua home directory, ovviamente devi assicurarti separatamente di avere accesso in scrittura a quel file di destinazione.
Un antipattern comune è reindirizzare tutto a /dev/null
(e quindi chiedere a Stack Overflow di aiutarti a capire cosa è andato storto quando qualcosa non funziona; ma non possiamo nemmeno vedere l'output perso!)
Dall'interno dello script, assicurati di mantenere separati l'output regolare (risultati effettivi, idealmente in forma leggibile da una macchina) e la diagnostica (solitamente formattata per un lettore umano). In uno script di shell,
echo "$results" # regular results go to stdout
echo "$0: something went wrong" >&2
Alcune piattaforme (e ad esempio GNU Awk) consentono di utilizzare il nome del file /dev/stderr
per i messaggi di errore, ma questo non è correttamente portabile; in Perl warn
e die
stampa con errore standard; in Python, scrivi sys.stderr
o usa logging
; in Ruby, prova $stderr.puts
. Notare anche come i messaggi di errore dovrebbero includere il nome dello script che ha prodotto il messaggio diagnostico.