Come risolvere tutti i tuoi problemi / problemi relativi a crontab (Linux)
Questa è una wiki della comunità , se noti qualcosa di errato con questa risposta o hai ulteriori informazioni, ti preghiamo di modificarlo.
Primo, terminologia di base:
- cron (8) è il demone che esegue i comandi pianificati.
- crontab (1) è il programma utilizzato per modificare i file dell'utente crontab (5).
- crontab (5) è un file per utente che contiene le istruzioni per cron (8).
Successivamente, educazione su cron:
Ogni utente su un sistema può avere il proprio file crontab. La posizione dei file crontab utente e root dipendono dal sistema ma sono generalmente inferiori /var/spool/cron
.
Esiste un /etc/crontab
file a livello di sistema , la /etc/cron.d
directory può contenere frammenti crontab che sono anche letti e gestiti da cron. Alcune distribuzioni Linux (ad esempio, Red Hat) hanno anche /etc/cron.{hourly,daily,weekly,monthly}
quali directory, script all'interno dei quali verranno eseguiti ogni ora / giorno / settimana / mese, con privilegio di root.
root può sempre usare il comando crontab; agli utenti regolari può essere concesso o meno l'accesso. Quando si modifica il file crontab con il comando crontab -e
e lo si salva, crond lo verifica per la validità di base ma non garantisce che il file crontab sia formato correttamente. C'è un file chiamato cron.deny
che specifica quali utenti non possono usare cron. Il cron.deny
percorso del file dipende dal sistema e può essere eliminato, il che consentirà a tutti gli utenti di utilizzare cron.
Se il computer non è acceso o il demone crond non è in esecuzione e la data / ora per l'esecuzione di un comando è passata, crond non rileverà ed eseguirà le query passate.
particolari crontab, come formulare un comando:
Un comando crontab è rappresentato da una singola riga. Non è possibile utilizzare \
per estendere un comando su più righe. Il #
segno hash ( ) rappresenta un commento, il che significa che qualsiasi cosa su quella linea viene ignorata da cron. Gli spazi iniziali e le righe vuote vengono ignorati.
Fai molta attenzione quando usi il %
segno percentuale ( ) nel tuo comando. A meno che non vengano salvati \%
, vengono convertiti in newline e tutto ciò che segue il primo non-escape %
viene passato al tuo comando su stdin.
Esistono due formati per i file crontab:
Crontabs dell'utente
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
Sistema ampio /etc/crontab
e /etc/cron.d
frammenti
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * user-name command to be executed
Si noti che quest'ultimo richiede un nome utente. Il comando verrà eseguito come l'utente nominato.
I primi 5 campi della riga rappresentano i tempi in cui il comando deve essere eseguito. È possibile utilizzare numeri o nomi di giorno / mese ove applicabili nelle specifiche dell'ora.
- I campi sono separati da spazi o schede.
- Una virgola (
,
) viene utilizzata per specificare un elenco, ad esempio 1,4,6,8, che significa eseguire a 1,4,6,8.
- Gli intervalli sono specificati con un trattino (
-
) e possono essere combinati con elenchi, ad esempio 1-3,9-12, che significa tra 1 e 3, quindi tra 9 e 12.
- Il
/
personaggio può essere usato per introdurre un passaggio, ad es. 2/5, che significa iniziare da 2 poi ogni 5 (2,7,12,17,22 ...). Non vanno oltre la fine.
- Un asterisco (
*
) in un campo indica l'intero intervallo per quel campo (ad es. 0-59
Per il campo dei minuti).
- Intervalli e fasi possono essere combinati, ad esempio
*/2
significa partire dal minimo per il campo pertinente, quindi ogni 2 ad esempio 0 per minuti (0,2 ... 58), 1 per mesi (1,3 ... 11) ecc.
Debug dei comandi cron
Controlla la posta!
Di default cron invierà qualsiasi output dal comando all'utente su cui sta eseguendo il comando. Se non c'è output non ci sarà posta. Se vuoi che cron invii la posta a un altro account, puoi impostare la variabile d'ambiente MAILTO nel file crontab ad es
MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command
Cattura l'output tu stesso
È possibile reindirizzare stdout e stderr a un file. La sintassi esatta per catturare l'output può variare a seconda di quale shell cron sta usando. Ecco due esempi che salvano tutto l'output in un file su /tmp/mycommand.log
:
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1
Guarda i registri
Cron registra le sue azioni tramite syslog, che (a seconda della configurazione) spesso passa a /var/log/cron
o /var/log/syslog
.
Se necessario, puoi filtrare le istruzioni cron con es
grep CRON /var/log/syslog
Ora che abbiamo esaminato le basi di cron, dove sono i file e come usarli, diamo un'occhiata ad alcuni problemi comuni.
Controlla che cron sia in esecuzione
Se cron non è in esecuzione, i tuoi comandi non saranno programmati ...
ps -ef | grep cron | grep -v grep
dovresti prenderti qualcosa del genere
root 1224 1 0 Nov16 ? 00:00:03 cron
o
root 2018 1 0 Nov14 ? 00:00:06 crond
In caso contrario, riavviarlo
/sbin/service cron start
o
/sbin/service crond start
Potrebbero esserci altri metodi; usa ciò che la tua distribuzione fornisce.
cron esegue il comando in un ambiente limitato.
Le variabili di ambiente disponibili sono probabilmente molto limitate. In genere, si otterrà solo poche variabili definite, come ad esempio $LOGNAME
, $HOME
e $PATH
.
Di particolare nota è il PATH
è limitato a /bin:/usr/bin
. La stragrande maggioranza dei problemi "il mio cron script non funziona" sono causati da questo percorso restrittivo . Se il tuo comando si trova in una posizione diversa, puoi risolverlo in un paio di modi:
Fornisci il percorso completo per il tuo comando.
1 2 * * * /path/to/your/command
Fornire un PERCORSO adatto nel file crontab
PATH=/usr:/usr/bin:/path/to/something/else
1 2 * * * command
Se il tuo comando richiede altre variabili d'ambiente puoi definirle anche nel file crontab.
cron esegue il comando con cwd == $ HOME
Indipendentemente da dove risiede il programma che si esegue sul filesystem, l'attuale directory di lavoro del programma quando cron viene eseguito sarà la home directory dell'utente . Se accedi ai file nel tuo programma, dovrai tenerne conto se utilizzi percorsi relativi o (preferibilmente) utilizzi ovunque percorsi completamente qualificati e risparmi a tutti molta confusione.
L'ultimo comando nel mio crontab non viene eseguito
Cron generalmente richiede che i comandi vengano terminati con una nuova riga. Modifica il tuo crontab; vai alla fine della riga che contiene l'ultimo comando e inserisci una nuova riga (premi invio).
Controlla il formato crontab
Non puoi usare un crontab in formato crontab utente per / etc / crontab o i frammenti in /etc/cron.d e viceversa. Un crontab formattato dall'utente non include un nome utente nella sesta posizione di una riga, mentre un crontab formattato dal sistema include il nome utente ed esegue il comando come tale utente.
Ho messo un file in /etc/cron.{hourly,daily,weekly,monthly} e non funziona
- Controlla che il nome del file non abbia un'estensione vedi parti di esecuzione
- Assicurarsi che il file disponga delle autorizzazioni di esecuzione.
- Indica al sistema cosa usare quando esegui il tuo script (es. Metti
#!/bin/sh
in alto)
Cron bug relativi alla data
Se la tua data è stata recentemente modificata da un aggiornamento utente o di sistema, fuso orario o altro, allora crontab inizierà a comportarsi in modo irregolare e mostrerà bizzarri bug, a volte funzionanti, a volte no. Questo è il tentativo di crontab di provare a "fare quello che vuoi" quando il tempo cambia da sotto di esso. Il campo "minuto" diventerà inefficace dopo la modifica dell'ora. In questo scenario, sarebbero accettati solo asterischi. Riavvia cron e riprova senza collegarti a Internet (quindi la data non ha la possibilità di reimpostare su uno dei server dell'ora).
Segni percentuali, di nuovo
Per enfatizzare i consigli sui segni di percentuale, ecco un esempio di cosa fa cron con loro:
# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz
creerà il file ~ / cron.out contenente le 3 righe
foo
bar
baz
Ciò è particolarmente invadente quando si utilizza il date
comando. Assicurati di sfuggire ai segni di percentuale
* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"