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.





Pingback: Linux: Spegnere o riavviare il PC ad orari stabiliti utilizzando il terminale | Chimera Revo
Pingback: BlogDreams.it » Blog Archive » Clam Antivirus: un ottimo antivirus per Ubuntu
Pingback: Clam Antivirus: un ottimo antivirus per Ubuntu - Chimera Revo
Pingback: SOURCES.LIST Aggregator » Blog Archive » Ubuntu: eseguire comandi dopo un periodo di tempo preimpostato grazie a KTimer
Pingback: Ubuntu: eseguire comandi dopo un periodo di tempo preimpostato grazie a KTimer - Chimera Revo
Pingback: Crontab made…easy (act II) : Crontab Code Generator
Pingback: Linux/Unix : Crontab made…easy : Corntab.
Pingback: La guida del giorno : cron e crontab,a cosa servono e come si usano? | Memegeek.it