La guida del giorno : cron e crontab,a cosa servono e come si usano?

L’esperienza mi ha insegnato a prendere confidenza con queste due paroline, ed a rendermi le due applicazioni praticamente indispensabili. Perchè? Ora vi spiego : cron e crontab sono due importantissime applicazioni native dei sistemi unix-like, che permettono di pianificare delle operazioni da eseguire con cadenza regolare. Cron è utilissimo sui server : supponiamo di avere in gestione un server remoto, e che alle 5 di ogni mattina volessimo svuotare, ad esempio, la cartella che contiene i logs del firewall. Saremmo disposti ad alzarci sistematicamente ogni mattina, a quell’ora, accedere al server ed eliminare il tutto? Ovviamente no, se possiamo chiedere al sistema di ricordare di farlo. E cron e crontab servono esattamente a questo. Vi ho portato l’esempio del server, ma cron può essere utile anche a livello domestico per programmare una scansione del sistema ogni tot giorni, un backup dei dati a cadenza mensile (il comando cp fa miracoli) e via dicendo… Vi dirò, per un periodo ho usato cron come sveglia.. eh si, dicevo al sistema di riprodurre un mp3 tutte le mattine alle sette! Non pensate io sia matta..la sveglia-cron faceva il suo dovere :)
E’ arrivato il momento di dirvi la differenza tra cron e crontab : crontab è l’applicazione che – in parole povere – permette agli utenti di programmare le operazioni, mentre cron è il demone che si ricorda di eseguirle..in pratica cron sorveglia determinate cartelle ( che variano di sistema in sistema) alla ricerca di operazioni da eseguire. Vediamo un po’ come configurare cron utilizzando crontab.

Inizio con il dirvi che crontab è sì il nome dell’applicazione, ma è anche il nome dei files che essa stessa utilizza. Per non far confusione, da questo momento in poi chiamerò l’applicazione crontab, e i files cronfiles. A cosa serve un cronfile? E’ un file con una sintassi ben precisa, che serve a specificare a cron che operazione eseguire e quando eseguirla. Parto con il dirvi che esistono due tipi di cronfiles (e di crontab) : quelli utente (la tipologia di file che sto per insegnarvi a scrivere, che definiscono le operazioni eseguite in runlevel utente), e quelli di sistema (molto simili ai precedenti, con la differenza che i cronfiles di sistema devono necessariamente risiedere in cartelle ben precise, e definiscono le operazioni da eseguire anche, volendo, in runlevel kernel). La differenza è sottile, ma molto importante a livello di sicurezza : nei cronfiles di sistema è possibile far sì che le operazioni vengano eseguite con i privilegi di root , mentre nei cronfiles utente ciascuna operazione specificata in essi viene eseguita solo e soltanto con i permessi dell’utente che ha schedulato le operazioni (che, in termini di sicurezza, è cosa buona e giusta). Al momento ciò può anche sembrarvi aramaico antico, ma aspettate di scoprire come si usano questi cronfiles e tutto vi sarà chiaro. Sappiate che stiamo andando a creare un cronfile utente. Per scrivere un cronfile correttamente ponetevi innanzitutto le seguenti domande:

  • Che operazione voglio eseguire?
  • In che giorno della settimana voglio eseguirla? (anche tutti)
  • Voglio che la mia operazione sia eseguita tutti i mesi oppure solo in un mese preciso (quale?)?
  • Voglio che la mia operazione sia eseguita tutti i giorni del mese o un giorno solo? Se si,quale?
  • A che ora (oppure ogni quanti minuti o ogni quante ore) voglio eseguire la mia operazione?

Prendiamo il banale caso della mia sveglia giornaliera.

  • Io voglio che il mio riproduttore musicale (percorso /usr/bin/vlc ) riproduca “The promised future aeons” (percorso : /home/malefika/Musica/Tpfa.mp3 ).
  • Voglio che la sveglia suoni tutti i giorni della settimana,esclusa la domenica.
  • Voglio che la sveglia suoni per tutto il mese di marzo.
  • Voglio che la sveglia suoni tutti i giorni del mese (da 1 a 31, l’esclusione della domenica viene gestita sopra).
  • Voglio che la sveglia suoni alle 7.00 di ogni giorno.

E ora la parte più ostica del procedimento : tradurre il tutto in un cronfile comprensibile da crontab. Il template di un cronfile è di questo tipo, una riga per ogni pianificazione da specificare:

minuto(0-59) ora(0-23) giorno(mese,1-31) mese(1-12) giorno(settimana,0-6) comando 1
minuto(0-59) ora(0-23) giorno(mese,1-31) mese(1-12) giorno(settimana,0-6) comando 2
minuto(0-59) ora(0-23) giorno(mese,1-31) mese(1-12) giorno(settimana,0-6) comando 3

riga vuota (altrimenti il cron non va)

Per i giorni della settimana associamo 0=domenica, 1=lunedì…6=sabato. E’ possibile specificare anche una wildcard, cioè un carattere jolly che significa “tutti” (l’asterisco, * ). Attenzione però a non utilizzare mai una wildcard nel campo minuti : vi ritrovereste ad eseguire la stessa operazione ogni minuto. E’ possibile specificare degli insiemi di periodi (ad esempio, se vogliamo che il nostro comando venga eseguito a marzo,ad aprile ed a luglio, scriveremo nel campo mese 03,04,07).
Torniamo alla nostra opera di traduzione. Vediamo come diventa ciò che ho scritto prima a parole:

  • Comando da eseguire: /usr/bin/vlc /home/malefika/musica/Tpfa.mp3
  • Tutti i giorni della settimana esclusa la domenica: 01,02,03,04,05,06
  • Il mese di marzo: 03
  • Tutti i giorni del mese: *
  • Alle sette in punto: 07 00

Leggiamo il tutto dal basso verso l’alto, ed ecco comparire la riga relativa alla nostra sveglia:

00 07 * 03 01,02,03,04,05,06 /usr/bin/vlc /home/malefika/musica/Tpfa.mp3

Per sicurezza, nel caso in cui la prima sveglia non dovesse sortire l’effetto desiderato (non bastasse a farci alzare) ne aggiungiamo una seconda, che suona un quarto d’ora dopo:

15 07 * 03 01,02,03,04,05,06 /usr/bin/vlc /home/malefika/musica/sveglia2.mp3

Ok, la nostra sveglia-cron è completa. Apriamo il nostro editor di testo preferito, e incolliamo il tutto (seguito da una riga vuota che,ripeto, è fondamentale):

00 07 * 03 01,02,03,04,05,06 /usr/bin/vlc /home/malefika/musica/Tpfa.mp3
15 07 * 03 01,02,03,04,05,06 /usr/bin/vlc /home/malefika/musica/sveglia2.mp3

Salviamo il file come “cronsveglia” nella nostra home directory. Adesso diciamo al crontab di schedulare questo cronfile-utente nel nostro crond. Apriamo un terminale, e digitiamo:

cd ~
crontab cronsveglia

Se tutto è andato bene le nostre operazioni sono state aggiunte al nostro crontab utente. Riavviamo, sempre da terminale, il servizio cron:

sudo -s
#inseriamo la password di root
service cron restart
exit

Abbiamo finito! Per verificare che il nostro crontab sia stato aggiunto, digitiamo sempre da terminale:

crontab -l

L’output dovrebbe essere pressappoco il seguente:

malefika:~$ crontab -l
00 07 * 03 01,02,03,04,05,06 /usr/bin/vlc /home/malefika/musica/Tpfa.mp3
15 07 * 03 01,02,03,04,05,06 /usr/bin/vlc /home/malefika/musica/sveglia2.mp3

Per eliminare tutti i nostri crontab, digitiamo invece.

crontab -r

Ora vi dico un altro paio di cosette relative a crontab.
Quando si ha a che fare con la manutenzione di un server spesso si utilizza il protocollo SSH per l’accesso a questo, e non sempre è possibile eseguire l’upload del cronfile in maniera immediata. Crontab perciò ha anche un’opzione -e che permette di utilizzare un editor per creare un cronfile; vi sono versioni di crontab che vi permettono di scegliere l’editor testuale da utilizzare, altre invece che non supportano questa funzione ed usano di default l’editor interno che, ad essere onesti, è un macello. Per ovviare a questo problema solitamente si dichiara (ed esporta) la variabile d’ambiente VISUAL (alla quale sarà associato il vostro editor di testo preferito, come ad esempio nano, pico, vi, vim, emacs e via discorrendo) e successivamente si invoca crontab per l’editing. In parole povere, se ad esempio volessimo utilizzare emacs come editor di testo, la sequenza di comandi a terminale sarebbe:


export VISUAL=emacs
crontab -e

Altra opzione (ve la dico, in modo che possiate EVITARE TASSATIVAMENTE di eseguirla per sbaglio) è l’opzione -d , che cancella – oltre ai vostri crontab – anche quelli di sistema. Non fatelo MAI. Ah, e ultima cosa ma non di minore importanza, abbiate la bontà di “dosare” bene i vostri crontab in base alle operazioni da eseguire : se dovete giocare sui tempi (un’operazione inizia quando quella precedente ha terminato la sua esecuzione) abbondate pure, se prevedete che l’operazione precedente impiega 1 ora e mezza per essere eseguita fate sempre conto che, invece, ne impiegherà due; cercate di non sovrapporre operazioni e, nel caso in cui lo facciate, non appesantite troppo il sistema (il processore potrebbe prendervi a schiaffi); tenete presente ciò soprattutto se NON avete accesso fisico alla macchina perchè, se sovraccaricate un server, saprete meglio di me che riavviarlo potrebbe costarvi caro in termini di tempo…e state attenti soprattutto perchè ci sono (se siete in “fitto”) dei providers che potrebbero anche bloccarvi l’accesso al cron (a me è capitato tanto tempo fa :( )!

Credo di aver detto abbastanza sull’utilizzo basilare di cron/crontab. Per ulteriori approfondimenti vi rimando alle loro manpages (sezione 8 per cron, sezione 1 per crontab riferito all’applicazione, sezione 5 per crontab riferito a quelli che fino ad ora abbiamo chiamato cronfiles), oppure potete chiedere direttamente a me lasciando un commento, per e-mail a malefiqina[at]gmail[dot]com oppure usando il modulo contatti. Nella speranza di essere stata chiara..auguro buonanotte (visto che sono le 4 e tra 3 ore “suona” il mio cron =P) a tutti!

Ps: se volete creare facilmente files di crontab senza sbagliare, leggete questo articolo.

21 Commenti

  1. Jessica Lambiase

    @vioma

    Che io sappia non è fattibile in questo modo (potrei sempre sbagliare), ma potresti fare in modo che l'output del programma sia rediretto su un file direttamente dalla linea di comando che scrivi nel file crontab.

    Saluti!

    Rispondi
  2. vioma

    Grazie per la Tua guida,

    è possibile vedere su una finestra di terminale provvisoria l'esecuzione di un comando in esecuzione su crontab?

    grazie per la risposta

    Rispondi
  3. Tanino Rulez

    @Ale
    Il tuo errore è di aver aggiunto il cancelletto :) Forse era poca chiara questa cosa nella guida, voleva dire che quello era un commento!

    Ho corretto, ora è tutto chiaro.

    Praticamente non devi mettere il cancelletto ma semplicemente lasciare una linea vuota a fine file :) Vedrai che ora funzionerà! Ciauu

    Rispondi
  4. Ale

    Non parte nulla :(((((

    alessandro@alessandro-laptop:~$ crontab cronprova
    alessandro@alessandro-laptop:~$ crontab -l
    27 11 * * * /usr/bin/vlc /home/alessandro/Musica/Amy_Winehouse_-_Rehab.mp3
    #
    alessandro@alessandro-laptop:~$ sudo -s
    root@alessandro-laptop:~# service cron restart
    cron start/running, process 3600
    root@alessandro-laptop:~# exit
    exit
    alessandro@alessandro-laptop:~$ crontab -l
    27 11 * * * /usr/bin/vlc /home/alessandro/Musica/Amy_Winehouse_-_Rehab.mp3
    #
    alessandro@alessandro-laptop:~$

    Rispondi
  5. Jessica Lambiase

    @Simone
    Felice di esserti stata utile, grazie a te!

    Rispondi
  6. Simone

    Mi ero sempre chiesto come funzionassero ma non avevo mai voluto trovare il tempo d’informarmi, temendo spiegazioni ostiche.
    Guida chiarissima, grazie :-)

    Rispondi
  7. Simone

    Mi ero sempre chiesto come funzionassero, ma non avevo mai voluto trovare il tempo di informarmi.
    Guida chiarissima, grazie :-)

    Rispondi
  8. Jessica Lambiase

    @elleti.brainvision
    Ciao!
    Lo sai che stavo per commuovermi? Grazie…
    Il fatto è semplice… so (e credo tante persone come me lo sanno) cosa significa leggere (da newbie quale – ahimè – anche io sono stata) una guida scritta in teNNico stretto..senza capirci un accidenti! Ci metto l’impegno per essere più chiara possibile.. e quando leggo che in qualche modo ci sono riuscita mi brillano gli occhi :)
    Concludendo… sul serio, come faremmo senza cron?
    Thanks again, tauu!

    Rispondi
  9. elleti.brainvision

    ciao!

    è la prima volta che leggo un articolo del tuo blog, ci sono arrivato da LinuxFeed..
    niente, volevo soltanto farti i miei complimenti, molto sinceri: il contenuto (e quindi cron) è già conosciuto da chi usa linux da un po’ di tempo (come si può fare senza cron?), ma credo però che chi non sapeva neppure dell’esistenza di cron, letta la tua piccola guida-introduzione, avrà già appreso molto.. ed il tutto facilmente! infatti secondo me hai una chiarezza invidiabile nello spiegare le cose. e si sa che se si parla di tecnicismi la situazione si complica ulteriormente..

    niente, solo questo. spero di leggerti ancora, in futuro, per ora, comunque,

    bau bau!!

    Rispondi
  10. Jessica Lambiase

    @shadenzo
    Di niente ;)

    @Chimera Revo
    Ma vai via… W pico/nano! Perchè complicarsi la vita? Ahahah =PPP

    Rispondi
  11. Chimera Revo

    export VISUAL=vi mi piace di più =P

    Rispondi
  12. shadenzo

    molto utile grazie :)

    Rispondi

Rispondi