Newsgroup: it.comp.os.linux.debian
Titolo: Dannato cron

Quale diavolo di motivo può esserci a non far funzionare il cron
giornaliero in una mia macchina?
# cat /etc/debian_version
4.0
# cat /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* *     * * *   root    test -x /usr/sbin/anacron || ( cd / && run-
parts --report /etc/cron.minuto )
0 *	* * *	root    test -x /usr/sbin/anacron || ( cd / && run-parts --
report /etc/cron.hourly )
0 0	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --
report /etc/cron.daily )
0 0	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --
report /etc/cron.weekly )
0 0	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --
report /etc/cron.monthly )
# l /etc/cron.daily/
totale 60
drwxr-xr-x  2 root root 4096 2009-01-28 15:35 .
drwxr-xr-x 88 root root 4096 2009-01-28 15:36 ..
-rwxr-xr-x  1 root root 5041 2007-02-26 22:53 apt
-rwxr-xr-x  1 root root  314 2007-03-14 15:46 aptitude
-rwxr-xr-x  1 root root  502 2007-01-02 18:34 bsdmainutils
-rwxr-xr-x  1 root root  419 2007-08-17 10:53 find
-rwxr-xr-x  1 root root   97 2009-01-28 15:35 logrotate
-rwxr-xr-x  1 root root  946 2007-01-29 13:20 man-db
-rw-r--r--  1 root root  102 2006-12-20 01:20 .placeholder
-rwxr-xr-x  1 root root  904 2007-10-29 20:56 spamassassin
-rwxr-xr-x  1 root root 3283 2006-12-20 01:20 standard
-rwxr-xr-x  1 root root 1307 2006-05-25 11:51 sysklogd
-rwxr-xr-x  1 root root   97 2009-01-27 15:13 zzy_smtpd_stats
-rwxr-xr-x  1 root root  183 2009-01-27 15:13 zzz_statistiche
# tail /etc/logrotate.conf
/var/log/mail.log {
    missingok
    daily
    rotate 3650
    create
    compress
    delaycompress
    start 0
    olddir /var/log/maillog_rotated
}
me ne accorgo perchè il mail.log non viene ruotato.
Ovviamente se eseguo manualmente lo script "logrotate" presente in /
etc/cron.daily la rotazione avviene perfettamente.
Anche i miei script customizzati "zzy_" e "zzz_" presenti nella
cron.daily non vengono eseguiti.
Tutti i file sono i default di debian eccetto il blocco del rotate che
ruota il mail.log

 report /etc/cron.daily )
prova a fare ls -l /usr/sbin/anacron
se il file c'e' e ha i permessi di esecuzione run-parts non verra' mai 
eseguito

 eseguito
# l /usr/sbin/anacron
ls: /usr/sbin/anacron: No such file or directory
Ma il bello è che se eseguo manualmente la riga del crontab, ovvero:
# test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/
cron.hourly )
funziona tutto correttamente.
Ma ho anche dei cron orari (quindi eseguiti con run-parts) che vanno
regolarmente.
Sono solo alcuni script presenti in tale directory che non vengono
eseguiti (tra cui i miei 2 personalizzati, eseguiti per ultimo, ed il
logrotate)

 logrotate)
se hai un attimo, posta il contenuto di uno degli script che non va

 se hai un attimo, posta il contenuto di uno degli script che non va
#!/bin/sh
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate --debug /etc/logrotate.conf
Prima comunque ho scritto una cosa imprecisa, tutti i cron in daily
non vanno, mentre invece vanno perfettamente i cron orari, i cron ogni
minuto e quelli mensili.
solo i daily non vanno.
Lo script postato sopra è il logrotate standard di debian, non ruota
nulla. Se eseguo il run-parts a mano invece funziona tutto. E' come se
il file "crontab" non venga processato, ma se così fosse non
funzionerebbe nessun cron, invece a me son solo quelli giornalieri a
non andare.

 non andare.
io farei una cosa di questo tipo:
il file /etc/crontab lo modificherei cosi'
0 0	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts -- 
report /etc/cron.daily && touch ~/crontab_avviato )
poi aggiungerei un eseguibile nella directory etc/cron.daily
#!/bin/bash
touch ~/script_eseguito
e modificherei il file logrotate
#!/bin/sh
touch ~/logrotate_entrato
test -x /usr/sbin/logrotate || exit 0
touch ~/logrotate_test_superato
/usr/sbin/logrotate --debug /etc/logrotate.conf
touch ~/logrotate_uscito_con_$?
poi dipende da quanta pazienza e voglia di capire hai, ovvio
andando in questo modo "a tappeto" il colpevole salta fuori di sicuro.

 andando in questo modo "a tappeto" il colpevole salta fuori di sicuro.
Fatto, aspettiamo pure domani ;)

 -- report /etc/cron.daily && touch ~/crontab_avviato )
E usare la direttiva MAILTO=tuoutente per ricevere la notifica
dell'attività di cron direttamente in mail? È fatto apposta.
Ad ogni modo, in syslog dovresti avere le notifiche dell'attività di
cron, guarda se ci sono errori lì.
-- 
Massimo Bacilieri AKA Crononauta

 cron, guarda se ci sono errori lì.
Assolutamente nessun errore.

 Assolutamente nessun errore.
Cioè gli script in /etc/cron.daily semplicemente vengono ignorati?
(nessuna notifica in syslog?).
A questo punto potresti anche essere drastico e creare un wrapper a
run-parts in /usr/local/sbin/run-parts.sh
#!/bin/bash
LOGFILE=/var/log/salcazzo.log
echo `date` >> $LOGFILE
echo "eseguo run-parts --verbose /etc/cron.daily" >> $LOGFILE
run-parts --verbose /etc/cron.daily 2>&1>> $LOGFILE
E poi in /etc/crontab invece di run-parts usi questo run-parts.sh che
logga la sua attività in modo verboso su un file di log specifico.
Poi guarda cosa viene fuori, magari trovi più informazioni.


 report /etc/cron.daily && touch ~/crontab_avviato )
# cat /etc/crontab | grep daily
0 0	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --
report /etc/cron.daily && touch /tmp/crontab_avviato )
# l /tmp/crontab_avviato
ls: /tmp/crontab_avviato: No such file or directory


 ls: /usr/sbin/anacron: No such file or directory
hai provato anche a fare le altre modifiche?
il file di test in /etc/cron.daily, e i touch in logrotate?
perche' c'e' da capire se run-parts esce con un errore, o se invece non 
viene proprio eseguito

 viene proprio eseguito
Si, le ho fatte, non viene creato nessun file...
Adesso provo a fare un file "aaa_touch" che mi fa il touch di un file
appena viene eseguito.
Magari uno degli script di default della debian si è spaccato e mi
blocca tutto.
MA: essendo run-parts, se uno script da errore, il run-parts dovrebbe
uscire dallo script per poi andare avanti con tutti gli altri, come se
fosse un "for i in *; do $i; done". Come è possibile che uno script
rotto blocchi tutti gli altri?

 rotto blocchi tutti gli altri?
Verifichi che ci sia anche lo switch --report e poi guardi la mailbox di
root o dell'utente a cui arrivano le segnalazioni di sistema.
Se un qualsiasi script genera output, cron lo raccoglie e lo manda nella
mailbox configurata.
Se inserisci anche lo switch --report in run-parts, in caso di errori
questo ti informa sia del nome dello script che del codice di errore.
Ad esempio questo è la mail generata quando uno script è uscito con errore
/etc/cron.hourly/4sigmaserver:
Errore 52: Impiegato 7875.124 secondi. -- The server didn't reply
anything, which here is considered an error.
run-parts: /etc/cron.hourly/4sigmaserver exited with return code 1
PSK

io proverei ancora una modifica del genere
0 0     * * *   root    test -x /usr/sbin/anacron && touch 
~/test_affermativo || ( touch ~/entrato1 && cd / && touch ~/entrato2 && 
run-parts -- report /etc/cron.daily)
quacosa adesso deve comparirti per forza
se non compare niente, vuol dire che neanche esegue cron

 questo ti informa sia del nome dello script che del codice di errore.
Io ho report e ricevo le mail di root.
Ma non ho nessuna mail dalla fine di dicembre.
Uhm...


Il comando
# run-parts --test /etc/cron.daily
cosa restituisce?
Questo ti dice cosa run-parts eseguirebbe.
PSK

 Questo ti dice cosa run-parts eseguirebbe.
Come già scritto da qualche parte, mi restituisce tutti i file che
eseguirebbe.
Stranamente, questi mattina ha eseguito il cron. eppure non ho
cambiato nulla, se non mettere i file di controllo come suggerito
sopra.