Perché il mio crontab non si è attivato?


29

Ho usato crontab -eper aggiungere la seguente riga al mio crontab:

* * * * * echo hi >> /home/myusername/test

Tuttavia, non vedo che il file di test sia scritto. Si tratta di un problema di autorizzazione o crontab non funziona correttamente?

Vedo che il processo cron è in esecuzione. Come posso eseguire il debug di questo?

Modifica - Chiedi a Ubuntu una bella domanda su crontab , purtroppo non mi aiuta ancora.

Modifica 2 - Hmm, sembra che il mio file di test abbia 214 righe, il che significa che negli ultimi 214 minuti è stato scritto su ogni minuto. Non sono sicuro di quale fosse il problema, ma evidentemente se n'è andato.

Risposte:


23

Ci sono implementazioni di cron(non tutte, e non ricordo quale sia, ma ne ho incontrato uno su Linux) che controlla i file crontab aggiornati ogni minuto al minuto e non considera nuove voci fino al minuto successivo . Pertanto, un crontab può richiedere fino a due minuti per accendersi per la prima volta. Questo potrebbe essere quello che hai osservato.


1
Immagino Solaris, o forse i primi Solaris. Ho l'abitudine di far funzionare la voce cron in 3-5 minuti in futuro quando testerò uno script da una voce crontab, perché ero sempre ingannato da questo comportamento.
Bruce Ediger,

fcronfa anche questo.
phunehehe,

Cosa succede se la routine di "controllo" costa più di qualche minuto? Ci saranno cronjob che dovrebbero essere attivati ​​durante questo lungo "controllo" che non sono stati attivati.
ospider

@ospider Il controllo richiede solo una frazione di secondo.
Gilles 'SO- smetti di essere malvagio' il

28

Hai aggiunto una riga vuota dopo il tuo cronjob ?


C'è una riga vuota dopo il mio cronjob.
ripper234

4
Non una riga vuota, ma una nuova riga alla fine dell'ultima riga. Un file di testo dovrebbe essere costituito da una sequenza di righe, ciascuna terminata da una nuova riga, quindi qualsiasi file di testo non vuoto termina con un carattere di nuova riga. Alcune utility non elaborano nulla dopo l'ultima riga in un file.
Gilles 'SO- smetti di essere malvagio' il

1
Questa è una questione di termini, "carattere di nuova riga" significa "dopo che questo carattere inizia una nuova riga di testo". Quindi anche 0 byte tra l'ultima riga nuova ed EOF possono essere considerati come una riga vuota ("riga che contiene 0 caratteri")
gelraen

10

Ho avuto lo stesso problema: un crontab funzionante si è fermato all'improvviso dopo aver aggiunto una nuova voce alla fine. Si è scoperto che avevo dimenticato di mettere una nuova riga dopo quest'ultima riga.

Ho scoperto emettendo il comando

cat /var/log/syslog | grep crontab

e l'output ha mostrato il problema:

Jul  2 08:16:01 shiva cron[1254]: (*system*) RELOAD (/etc/crontab)
Jul  2 08:16:01 shiva cron[1254]: (*system*) ERROR (Missing newline before EOF, this crontab file will be ignored)

L'aggiunta della nuova riga e il salvataggio hanno risolto il problema.


5

Sembra che questo sia risolto. La prossima volta, prova anche a registrare STDERR. Quanto segue accederà solo a STDOUT, non a STDERR:

* * * * * echo hi >> /home/myusername/test

Cerca di assicurarti che esista una clausola esplicita anche per STDERR. Altrimenti, STDERR potrebbe essere inviato via e-mail all'utente (supponendo che l'e-mail funzioni) o potrebbe non andare da nessuna parte, a seconda della configurazione di Cron.

* * * * * echo hi >> /home/myusername/test 2> /home/myusername/test.stderr

La mia preferenza è di inviare l'output di cronjob a syslog. In questo modo sto sfruttando qualsiasi infrastruttura syslog esistente (syslog centralizzati, Splunk, rotazione dei log già supportata, è facile confrontare i messaggi in / var / log / messages & / var / log / cronjob, ecc.), E non lo sono spamming agli amministratori di sistema (me) con e-mail non necessarie.

* * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob

2

Con me il problema era che lo script non era eseguibile. Ho avuto crontab -e setup in questo modo

* * * * * /bin/my-script.sh

E il file myscript non era eseguibile, quindi ho corso

chmod +x my-script.sh

Immediatamente ho iniziato a vedere l'output come previsto.


1

La tua cron line funziona perfettamente sul mio computer quando cambio myusernaea phunehehe. Esistono diversi modi per scoprire cosa non va nel tuo sistema.

Cron di solito invia posta all'utente quando c'è qualcosa che non va. Se vedi il messaggio "Hai posta" usa un client di posta per controllare la tua casella di posta . Oppure, controlla nella tua home directory, potrebbe esserci un file chiamato dead.letterlì.

Puoi controllare le /var/log/voci relative a cron. Sul mio computer il file di registro è su /var/log/cron/current(richiede l'accesso come root).

Se si dispone dell'accesso root, è possibile arrestare il demone cron e avviarlo in modalità debug. Ad esempio, vorrei usare (cambiare fcronil nome del tuo demone):

killall fcron
fcron --foreground --debug

Come faccio a scoprire il nome del mio demone?
ripper234

@ ripper234 use ps -ef | grep crone dovresti vedere una riga per il tuo cron. Controlla la pagina man del cron per vedere il flag per il debug. È probabile che tu stia utilizzando Vixie Cron , in quel caso è il flag di debug -x. Uccidi il processo cron e riavvialo con il flag aggiuntivo.
phunehehe,

Controlla anche / var / log / syslog. Nel mio caso, ci sono stati avvisi che il file cron era scrivibile in gruppo.
Tratta bene le tue mod il

1

Molto probabilmente, quando cron fallisce, genera una e-mail all'ID utente del processo cron su quel computer. Se non hai un MTA funzionante sul tuo computer, o non stai leggendo o inoltrando quella posta da qualche altra parte, non vedrai quel messaggio, anche se l'MTA funziona.

Un buon modo per ottenere gli errori del tuo crontab via mail è far apparire il tuo crontab in questo modo:

MAILTO="myemail@example.com"
* * * * * echo hi >> /home/myusernae/test

Ovviamente, usa il tuo indirizzo e-mail anziché myemail@example.com. Questo dice a cron di inviare errori al tuo indirizzo e-mail anziché all'account locale. In particolare, questo è utile se hai un crontab di root (o un frammento di crontab in /etc/cron.d) a cui vuoi solo inviarti un output, puoi evitare di spammare la casella di posta di root o l'indirizzo di inoltro di root.


Non so se il sistema ha un server SMTP / di posta in uscita configurato. Le probabilità sono che non lo sia.
ripper234

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.