it-swarm.it

Dove vengono registrati gli errori cron?

Se imposto erroneamente cron lavori, questi sembrano fallire silenziosamente. Dove devo cercare un registro degli errori per capire cosa è andato storto?

182
Brian Lyttle

Come altri hanno sottolineato, cron ti invierà per e-mail l'output di qualsiasi programma in esecuzione (se esiste un output). Quindi, se non ottieni alcun output, ci sono sostanzialmente tre possibilità:

  1. crond non ha nemmeno potuto avviare una Shell per eseguire il programma o inviare e-mail
  2. crond ha avuto problemi con l'invio dell'output oppure la posta è andata persa.
  3. il programma non ha prodotto alcun output (inclusi i messaggi di errore)

Il caso 1. è molto improbabile, ma qualcosa dovrebbe essere scritto nei registri cron. Cron ha una propria funzione syslog riservata, quindi dovresti dare un'occhiata a /etc/syslog.conf (o il file equivalente nella tua distribuzione) per vedere dove vengono inviati i messaggi della funzione cron. Le destinazioni popolari includono /var/log/cron, /var/log/messages e /var/log/syslog.

Nel caso 2., dovresti ispezionare i log del demone mailer: i messaggi dal demone Cron di solito appaiono come da [email protected]. Puoi usare un MAILTO=... linea nel file crontab per fare in modo che cron invii e-mail a un indirizzo specifico, il che dovrebbe rendere più semplice il grep dei log del demone mailer. Per esempio:

[email protected]
00 15 * * *  echo "Just testing if crond sends email"

Nel caso 3., puoi verificare se il programma è stato effettivamente eseguito aggiungendo un altro comando di cui puoi facilmente verificare l'effetto: ad esempio,

00 15 * * * /a/command; touch /tmp/a_command_has_run

quindi puoi verificare se crond ha effettivamente eseguito qualcosa guardando il mtime di /tmp/a_command_has_run.

116
Riccardo Murri

È sempre possibile inviare in modo esplicito l'output del processo a un file di registro:

0 8 * * * /usr/local/bin/myjob > /var/log/myjob.log 2>&1

Tieni presente che questo sostituirà il comportamento della posta che è stato menzionato in precedenza, perché crond stesso non riceverà alcun output dal lavoro. Se vuoi mantenere quel comportamento, dovresti guardare in tee (1).

54
codehead

Se non vedi le mail, potresti inviare spam alla tua azienda con gli errori che possono essere abbastanza fastidiosi per le persone che usano quell'account per il monitoraggio. Prova invece a inviare l'output a Syslog:

*/5 * * * * yourcronjob 2>&1 | /usr/bin/logger -t yourtag

Quindi, attendere l'esecuzione del cronjob e cercare l'errore in/var/log/messages (o /var/log/user.log su alcuni sistemi).

Funziona benissimo per i messaggi di errore che sono lunghi solo 1-2 righe, come "yourcronjob: comando non trovato". Utilizza inoltre l'infrastruttura syslog esistente (Logrotation, syslogging centrale, Splunk, ecc.) Riduce inoltre lo spam delle e-mail alla radice.

Potrebbe non essere una buona soluzione se il tuo cronjob genera centinaia di righe di output.

44
Stefan Lasiewski

Dovresti ricevere email da crond quando il lavoro non riesce o quando il lavoro restituisce un codice di uscita diverso da zero. Prova a digitare:

$ mailx

al comando Prompt.

mailx(1) è il programma base di lettura della posta su quasi tutti i sistemi Unixlike. È molto primitivo per gli standard moderni, ma puoi praticamente contare su di esso per essere sempre disponibile. Potrebbero essere disponibili altri agenti di posta migliori, ma ce ne sono abbastanza che non sai mai quale è installato su una macchina casuale che stai utilizzando.

Si noti che, a meno che non sia stato configurato il sistema come server di posta elettronica Internet, questo sottosistema di posta viene utilizzato solo all'interno della macchina. Puoi inviare e-mail ae ricevere da altri utenti sulla macchina, ma potresti non essere in grado di inviare e-mail al mondo, e certamente le e-mail dal mondo esterno non saranno in grado di arrivare alla tua macchina.

8
Warren Young

La configurazione cron predefinita ti invierà una mail con l'output del tuo programma. In caso contrario, è possibile provare a racchiudere il programma in errore in uno script Shell che garantisce che il programma non fallisca e che sia possibile registrare ulteriormente l'output.

Questa è un'impostazione configurabile su alcune implementazioni cron.

8
miguel.de.icaza

Cron registra le informazioni di base su /var/log/messages, ma invia qualsiasi output del programma all'utente che invoca.

5
Hemant

Mi sono imbattuto in questo thread alcuni anni fa sperimentando gli stessi problemi e proprio di recente ho trovato una soluzione ai casi sopra menzionati di Ricardo. La mancanza di un'e-mail è difficile da rilevare (come hai già detto) e certamente non vuoi spammare la tua e-mail root @ yourcompany. Se interessati, controlla deadmanssnitch.com. . Questo strumento sembra risolvere i casi di cui sopra. Sembra piuttosto semplice da usare: basta aggiungere il pezzetto di codice che lo strumento ti dà al tuo cronjob. Se il lavoro non viene eseguito su un interno specificato, verrai avvisato. Se il tuo lavoro riprende a funzionare, verrai avvisato.

2
ss_jt

Io uso vixie-cron, quindi non so se questo vale per tutto. Ma ho un dead.letter file che contiene tutto l'output del lavoro.

Nel mio /root/ cartella che ho crons.cron che ho impostato come mio crontab eseguendo crontab /root/crons.cron. dead.letter verrà creato in /root/ anche.

Modifica Ho appena Google dead.letter, ed è una posta non consegnabile. Apparentemente non ha nulla a che fare con cron. Se non hai configurato correttamente la posta (come me), avrai il file.

1
jonescb

Un altro trucco utile è vedere quali script sono effettivamente eseguiti.

Questo viene fatto con run-parts -v --test /etc/cron.hourly/

> /etc/cron.hourly//logrotate

Se lo script non viene visualizzato, non verrà eseguito.

Questo BTW funziona solo per gli script installati in /etc/cron.hourly directory. Non mostra gli elementi impostati nel tuo crontab.

1
RickyA

Per i neofiti, questo potrebbe essere un problema per il debug. Assicurarsi di non scambiare i valori dei minuti e delle ore. Prima arriva il minuto, poi l'ora. Quando fornisci valori inferiori a 12 per ciascuno, li accetterà ma potrebbe non funzionare come previsto o affatto.

0
Michael Woyo