Cron job giornaliero non in esecuzione


10

Una rapida panoramica: ho uno script che eseguirà quotidianamente il backup del mio repository di codice sorgente da SVN in un tarball per quel giorno. Ho testato lo script e funziona molto bene finché lo eseguo come sudo, a causa della proprietà della directory di output.

Quindi il problema è che voglio eseguirlo quotidianamente, quindi inserisco un link nella directory /etc/cron.daily. Ecco i contenuti della directory.

thom@spenser:/etc/cron.daily$ ls -l
total 60
-rwxr-xr-x 1 root root   189 2011-09-14 02:21 apport
-rwxr-xr-x 1 root root 15535 2011-10-06 11:30 apt
-rwxr-xr-x 1 root root   314 2011-08-08 16:57 aptitude
lrwxrwxrwx 1 root root    24 2012-02-28 11:05 backup -> /usr/local/bin/backup.sh
-rwxr-xr-x 1 root root   502 2011-06-08 11:48 bsdmainutils
-rwxr-xr-x 1 root root   256 2011-10-06 04:04 dpkg
-rwxr-xr-x 1 root root   372 2011-10-04 16:50 logrotate
-rwxr-xr-x 1 root root  1353 2011-07-27 07:17 man-db
-rwxr-xr-x 1 root root   606 2011-08-17 09:16 mlocate
-rwxr-xr-x 1 root root   249 2011-06-24 05:36 passwd
-rwxr-xr-x 1 root root  2417 2011-07-01 17:25 popularity-contest
-rwxr-xr-x 1 root root   383 2011-09-30 15:09 samba
-rwxr-xr-x 1 root root  3594 2011-09-19 20:07 standard
thom@spenser:/etc/cron.daily$ 

Il problema è che semplicemente non funziona mai. Ecco le autorizzazioni per quello script:

thom@spenser:/etc/cron.daily$ ls -l /usr/local/bin/backup.sh 
-rwxr-xr-x 1 root root 260 2012-02-28 11:03 /usr/local/bin/backup.sh

Idee?


2
Se possibile, ti preghiamo di considerare di chiudere alcune delle tue altre domande aperte selezionando la risposta migliore (se ne hanno una). Abbiamo bisogno che gli utenti mantengano le loro domande in modo che il sito possa essere uno strumento efficace per la prossima persona con i tuoi problemi. Per maggiori dettagli sulle migliori pratiche, prendi in considerazione la lettura delle FAQ su come porre domande .
Bruno Pereira,

Risposte:


37

Ho provato questo

run-parts --test /etc/cron.daily

Ho scoperto che il mio file update.ubuntu non è venuto fuori. Ho anche notato che il mio file aveva un'estensione (ha un punto).

I passaggi per risolvere questo problema.

  1. Rinominato mio update.ubuntu in update-ubuntu
  2. Ora di nuovo run-parts --test /etc/cron.daily, questa volta è arrivato il mio file!

1
Sì, questo mi ha risolto il problema. Non gli piacciono i punti nel nome del file, rinominare il mio file da myscript.sh a myscript ha funzionato per me.
Matt Parkins,

3
Questo deve essere più alto. Ho avuto il mio script salvato come il tradizionale "backup.sh". Rimozione della parte ".sh" risolto. Grazie mille!
David,

Grazie! Il ragazzo / ragazza che ha deciso di rimuovere implicitamente i file .sh dal cron quotidiano dovrebbe essere vergognoso!
Sylvain,

Dovrebbe essere frustato pubblicamente! ;-) Mi chiedo quanto tempo le persone hanno perso collettivamente a causa di questa decisione ... Mi chiedo anche se ci fosse una buona ragione per questo?
xastor,

3

Potrebbe essere una delle diverse cose:

Percorso delle radici:

A seconda dei comandi in esecuzione, potrebbe essere necessario espandere la variabile PATH degli utenti root posizionando la seguente riga nella parte superiore del file crontab:

PATH = / usr / sbin: / usr / bin: / sbin: / bin

src: https://help.ubuntu.com/community/CronHowto

Oppure usa solo percorsi completi per ogni comando nel tuo script: /bin/lsanziché lsad esempio. ( which lsalla riga di comando per i percorsi).

C'è uno strano bug relativo ai punti nel nome file riportato qui . Potrebbe estendersi al file che si sta collegando, anche se questo sembra improbabile.

Stai salvando l'output dal file di backup? Metti qualcosa del genere sulla prima riga, per aiutare a determinare se non è affatto in esecuzione o in esecuzione ma a un certo punto non riesce.

/bin/echo "Attempting to run backup" >> /path-to-home/backup.log

In alternativa, prova ad aggiungere direttamente lo script al file crontab:

sudo -i
crontab -e
[add the next line to the file, then save and exit]
33 15 * * * /usr/local/bin/backup.sh

funzionerà alle 15:30 ogni giorno se la macchina è accesa. utilizzare * * * * * durante il test per eseguirlo una volta al minuto fino a quando non funziona.


1
L'uso di percorsi assoluti negli script è sconsigliato. Se non sai cos'è il PERCORSO, impostalo tu stesso nello script. Vedi i motivi per cui crontab non funziona
geirha

Link utile, grazie. Il motivo dato per non utilizzare percorsi completi è la portabilità. Giusto. Un'altra soluzione ragionevole è quella di definire i comandi che stai usando all'inizio dello script, insieme ad altre configurazioni: LS = / bin / ls; SRC_DIR = / home / joe / src. Quindi utilizzare $ LS $ SRC_DIR. Mantiene tutto definito in alto e in un unico posto.
Sean,

Trovo che per ridurre la leggibilità, e devi andare su ogni COMANDO = / percorso / a / comando per ogni nuovo sistema su cui dovrebbe funzionare. Su un sistema, tutti i comandi necessari potrebbero essere in / usr / bin, su un altro alcuni sono in / bin, altri in / usr / bin. Il solo fatto di avere / usr / bin e / bin in PATH rende questo un problema. In una nota a margine, i nomi delle variabili devono essere minuscoli, altrimenti si rischia di sovrascrivere variabili di shell speciali o variabili di ambiente.
geirha,

ri: nomi di variabili maiuscole. L'ho sempre fatto senza pensarci troppo, grazie ai primi script che ho visto farlo. Ma hai ragione, non c'è rialzo e possibilità di svantaggio. Grazie per averlo sottolineato, rompendo questa abitudine ora.
Sean

1

Grep il tuo syslog per messaggi come;

crond: (*system*) BAD FILE MODE

i file devono essere limitati a (è sufficiente) a 644):

chmod 0644 /etc/cron.d/my_crontab
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.