Guida a cron, crontab

Su linux per schedulare un operazione ci viene in aiuto il demone cron, esso ogni minuto controlla se c’è un poperazione da compiere in quel preciso istante e se c’è la esegue, altrimenti dorme per un altro minuto…

Tutto cio’ che viene scritto sullo standard output, viene inviato via email al proprietario del cron, tipicamente “root”.
Ci sono modi diversi di specificare operazioni ed intervalli.

Configurazioni e modalità

La via più semplice è la creazione di uno script “sh, bash, perl, etc..” che esegue ciò che vogliamo. Tale script andrà inserito in una delle directory seguenti

/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly

per poter essere eseguito ad intervalli definiti ( un giorno, un’ora, un mese e una settimana).

E’ possibile anche mantenere tutti gli script in una directory standard (ad esempio “/avvio”) e poi creare un soft link con il comando: “ln -s” in una di quelle sopra elencate.

Per intervalli di tempo diversi da quelli standard, è possibile usare la directory

/etc/cron.d

oppure il file

/etc/crontab

In cron.d possono essere inseriti file con formato particolare (lo stesso di crontab), indicanti operazioni ed intervalli di tempo piccoli anche solo minuto.

Formato:

Possono essere inseriti in ogni file

  • commenti
  • linee vuote
  • assegnazioni di variabili di ambiente
  • comandi cron: i commenti sono linee che iniziano con il simbolo “#” e come le linee vuote vengono ignorati.

Per quanto riguarda le variabili di ambiente, fra le possibili utilizzabili vi sono

  • SHELL, ovvero la shell da usare per l’esecuzione dei comandi
  • PATH, ovvero il path dove cercare i comandi indicati
  • MAILTO, ovvero a chi mandare via email l’output dei comandi. L’email viene inviata anche se questa variabile non viene settata

Una tecnica comunemente usata per evitare l’invio della mail, o evitare la scrittura del risultato dell’operazione sulla mail che viene inviata, e’ la redirezione dell’output sul dispositivo “/dev/null”, esempio:

/prova/test.sh>/dev/null

I comandi cron rappresentano la parte più complessa della configurazione.
Il formato di un comando cron è il seguente:

s1 s2 s3 s4 s5 Proprietario Comando

Analizzando:

Comando è un comando da eseguire (con i relativi parametri ed eventuali redirezioni di output).
Proprietario indica a chi appartiene il comando cron (es. root o altri utenti).

s1, s2, s3, s4, s5 sono stringhe che specificano l’intervallo di esecuzione. Ognuna di queste stringhe può contenere il carattere “*” per indicare tutti i valori possibili.

s1 rappresenta i minuti. I valori permessi vanno da 0 a 59. E’ possibile specificare anche intervalli (piu’ avanti spiegati brevemente).
s2 rappresenta le ore. I valori permessi vanno da 0 a 23. E’ possibile specificare anche intervalli (piu’ avanti spiegati brevemente).
s3 rappresenta i giorni all’interno di un mese. I valori permessi vanno da 1 a 31. E’ possibile specificare anche intervalli (piu’ avanti spiegati brevemente).
s4 rappresenta i mesi. I valori permessi vanno da 1 a 12 (piu’ i nomi in lettere). E’ possibile specificare anche intervalli (piu’ avanti spiegati brevemente).
s5 rappresenta i giorni della settimana. I valori permessi vanno da 0 a 7 (piu’ i nomi in lettere, 0 e 7 rappresentano entrambi la Domenica). E’ possibile specificare anche intervalli (piu’ avanti spiegati brevemente).

NB: Tutte e cinque le stringhe possono rappresentare un numero, tutti i valori oppure un intervallo.
Specificando un numero, si indica un momento preciso. Ad esempio, mettere 2 in s4, significa eseguire a Febbraio (vanno considerate poi anche tutte le altre 4 stringhe).
Se il particolare campo non interessa, cioe’ non e’ utile alla definizione del tempo di attivazione, puo’ essere usato l’asterisco (“*”) per indicare tutti i valori.

Molto spesso, però quello che serve è un certo intervallo e non un momento unico e preciso. Per esempio, potremmo volere eseguire un comando ogni 2 minuti invece che sempre e solo nel secondo minuto. In questo caso, possiamo scrivere le cinque stringhe (o solo una parte di esse) sotto forma di intervallo. Vediamone qualche formato (non tutti potrebbero essere supportati su tutti i sistemi):

  • */n indica ogni “n”. Esempio, “*/2″ indica ogni 2.
  • n1-n2 indica da n1 a n2. Esempio, “5-8″ indica 5,6,7,8.
  • n1-n2/n3 indica ogni n3 all’interno del range n1-n2. Esempio, 3-21/6 indica 3,9,15,21 (ongi 6 nel range 3-21).
  • n1,n2,… indica i numeri specificati. Esempio, 4,7,8 indica tutti i numeri scritti.
  • n1-n2,n3-n4 indica da n1 a n2 e da n3 a n4. Esempio, 3-5,7-9 indica 3,4,5,7,8,9.

Sono possibili anche altre combinazioni.
Qualche esempio:

# Esegue il comando indicato ogni cinque minuti, solo il 15 di ogni mese,
# con proprietario “root”
*/5 * 15 * * root /bin/ls /var/log/ls>/tmp/ls.output

# Manda una mail con il testo indicato ogni giorno alle 8:00 di mattina,
# con proprietario “root”. Se MAILTO vale “root” allora la mail arriva a root.
0 8 * * * root echo “Salve!!!”

#Esegue ogni minuto!!! Il proprietario e’ “test”.
* * * * * test /usr/bin/mousepad

Un utente diverso da root, per usare dei propri comandi cron personalizzati, può agire direttamente sulla directory:

/var/spool/cron/crontabs/

Il file non dovrebbe essere editato direttamente e di solito non può esserlo da parte di un utente diverso da root in quanto viene gestito dal comando /usr/bin/crontab.

L’idea è che venga mantenuto un file master con i cron di un utente.
Il file master può risiedere ovunque nel filesystem.
Con l’installazione, crontab ne copia il contenuto all’interno del file “/var/spool/cron/crontabs/nomeutente”.
Sempre con crontab (“man crontab”) è possibile rimuovere i cron installati.
La politica per cui un utente può usare il comando “crontab” e’ regolata dai file

/etc/cron.allow
/etc/cron.deny

Supponiamo di usare come test l’utente “utente1” con home directory “/home/utente1“. Creiamo il file “/home/utente1/test.cron” con il seguente contenuto:

# Test di utilizzo di crontab

MAILTO=utente1@localhost
* * * * * utente1 echo “ciao utente1”

Questo cron setta la mail per inviare l’output a utente1 e scrive il messaggio “ciao utente1″ ogni minuto.

Per installare il contenuto del file indicato, eseguire nel caso si stia lavorando da utente root:

/usr/bin/crontab -u utente1 /home/utente1/test.cron

oppure, se si sta lavorando come utente “utente1″:

/usr/bin/crontab /home/utente1/test.cron

Si noterà la comparsa del file “/var/spool/cron/crontabs/utente1” con il seguente contenuto (o simile):

# DO NOT EDIT THIS FILE – edit the master and reinstall.
# (/home/user1/test.cron installed on *)
# (Cron version — $Id: crontab.c etc….)
MAILTO=utente1@localhost
* * * * * utente1 echo “ciao utente1”

NB: L’installazione dei cron di un utente, sovrascrive i cron eventualmente già presenti per l’utente stesso.

Per aggiungere comandi cron senza eliminare quelli precedenti, e senza inserirli prima nel master, usare se si sta lavorando come utente root:

/usr/bin/crontab -u utente1 -e

se si sta lavorando come utente “user1″:

/usr/bin/crontab -e

Si aprira’ l’editor “vi” con i comandi gia’ presenti e ci sara’ la possibilita’ di inserirne di nuovi oppure di modificare, oltre che eliminare, quelli esistenti. Tutto cio’ non tocca il file master ma solo il file “/var/spool/cron/crontabs/user1“, evitando la procedura di reinstallazione.
Tipicamente si edita il file master e lo si reinstalla, in modo da evitare di perdere le modifiche inserite con “-e”.
Per eliminare i cron inseriti, usare se si sta lavorando come utente root:

/usr/bin/crontab -u user1 -r

se si sta lavorando come utente “utente1″:

/usr/bin/crontab -r

Articolo originale

Se ti è stato utile il mio articolo, spendi un secondo del tuo tempo e dammi un +1, Google ed io ne saremmo felici 🙂 Grazie mille 🙂

11 Risposte a “Guida a cron, crontab”

  1. grazie
    il tuo articolo mi è stato utile
    credo di aver fatto un piccolo progresso

  2. avrei bisogno di fare un cron che mi scarichi un file usando un link e me lo salvi all’interno si una cartella sul mio server. a chi mi posso rivolgere per farmelo fare? Grazie!

  3. Ciao Marco,
    allora per scaricare un file in una certa cartella devi creare uno script Bash (.sh) nel quale al suo interno usi il comando wget che serve a scaricare.
    Facciamo un esempio: supponiamo che io voglia scaricare l’immagine della smile a questo link: http://nelsonaspen.com/blog/wp-content/uploads/2012/05/smile.jpg nella cartella: /home/predator1987,
    drovrò semplicemente scrivere: “wget -P /home/predator1987/ http://nelsonaspen.com/blog/wp-content/uploads/2012/05/smile.jpg
    Come puoi vedere la cosa è abbastanza semplice, poi utilizzando il comando cron deciderai ogni quanto tempo lo script scaricherà il file 😉

    PS. Se vuoi che il file scaricato venga sovrascritto dai un’occhiata a questo link http://labs.zero.it/2010/10/wget-overwrite-file/.

  4. …scusa la cavolata – è che sono semineofita … SE VOLESSI INSERIRE TIPO OGNI 3 MINUTI LA STRINGA “”CIAOOO” NEGLI APPUNTI, x averla sempre reperibile, com’è l’istruzione’¿? …TnX a lOOOt !!! O_O

  5. Ciao Enry 🙂
    per lanciare un comando ogni 3 minuti c’è scritto sopra 😉
    Per quanto riguarda l’inserimento di una stringa negli appunti, dipende da che sistema operativo usi e da come lo stai usando (es: con o senza X).
    Se usi X hai a disposizione il comando: xclip, se usi mac pbcopy, se non usi X c’è gmp, se sei su windows con cygwin manda la stringa in /dev/clipboard.
    Spero di esserti stato utile.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

18 + tredici =

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.