programmazione,

Automatizzare il Mac dal Terminale - Sua maestà cron

Sabino Maggi Sabino Maggi Segui 22-Nov-2014 · 8 minuti di lettura
Condividi

Nella prima parte di questa serie abbiamo visto come usare il comando at per automatizzare determinate attività sul Mac dal Terminale.

At è utile ogni volta che si vuole eseguire un comando automaticamente una sola volta e in un momento ben definito

Ma at ha anche parecchi limiti e non è adatto a svolgere una attività periodica in modo trasparente, come richiesto da Lucio Bragagnolo nel post da cui ha preso spunto questa serie.

Un demone chiamato cron

Lo strumento più adatto a questo scopo è cron, il cui nome deriva dal greco chronos (tempo). Cron permette di eseguire comandi singoli o interi script, in modo automatico ad una data e ora stabilita, con una precisione che arriva fino al minuto.

Cron è nel gergo di Unix un demone, un comando eseguito automaticamente all’avvio di OS X (o di Linux) che rimane sempre attivo in sottofondo e agisce senza necessità di alcun intervento da parte dell’utente. Cron si attiva ogni minuto ed esegue (quando serve) i comandi contenuti nel file crontab di configurazione.

Ogni utente del Mac ha a disposizione un proprio file crontab, ma esiste anche un file crontab di sistema gestito dall’amministratore, normalmente il primo utente creato al momento della installazione di OS X. I file crontab degli utenti sono contenuti nella directory /usr/lib/cron/tabs/ e si chiamano con il nome account (o nome breve) dell’utente, quello di sistema è /etc/crontab.

Non c’è bisogno di precipitarsi a controllare, nelle nuove versioni di OS X il file /etc/crontab non esiste più, come vedremo la prossima volta.

Dal Terminale, si può visualizzare il contenuto del proprio file crontab con il comando

$ crontab -l

mentre per modificarlo bisogna necessariamente usare

$ crontab -e

e mai un editor di testo (cosa fra l’altro impossibile senza essere amministratore del Mac).

Infine il comando per cancellare il proprio file crontab è

$ crontab -r

Com’è fatto crontab

Ma come è fatto un file crontab? È piuttosto semplice: un file crontab è composto da una o più righe contenenti ciascuna sei campi (colonne) separati da spazi

*	*	*	*	*	comando

Nei primi cinque campi si inseriscono le indicazioni di data ed ora, sostituendole agli asterischi, nell’ultimo campo il comando o il nome dello script da eseguire. Ad esempio,

05	*	*	*	*	echo "Tanti saluti da cron!"

stamperà sul Terminale al quinto minuto di ogni ora la stringa “Tanti saluti da cron!”

In realtà sul Terminale non viene mai stampato nulla. Infatti, analogamente ad at, ogni volta che cron esegue un comando definito nel file crontab di un utente, provvede ad inviargli una email con l’output completo generato dal comando stesso, email che può essere letta dal Terminale con (chi ci avrebbe mai pensato!) mail. La ragione è semplice: cron potrebbe agire dietro le quinte per mesi od anni, effettuando azioni periodiche come il backup in rete di determinate directory o la pulizia del sistema da certi file inutili. È più razionale inviare all’utente interessato una email che gli permetta di controllare, quando ne ha tempo e voglia, che tutto vada bene, invece di disturbarlo periodicamente mentre sta usando il Terminale con l’output delle azioni eseguite da cron.

Per disabilitare l’invio della email mandando l’output del comando eseguito da cron sul file output.txt sul Desktop, si può utilizzare la tecnica standard di Unix di redirezione dell’output

<pre> 05 * * * * echo "Tanti saluti da cron!" >> ~/Desktop/output.txt </pre>

dove il simbolo >> aggiunge l’output del comando eseguito da cron alla fine del file output.txt (usando un solo > si sovrascrive ogni volta il contenuto precedente del file).

Data e ora in cron

Rimane da definire come sono codificate le indicazioni della data e dell’ora a cui eseguire cron. Non è molto difficile, almeno se ci si limita ai casi più comuni. La figura seguente mostra il significato dei campi del file crontab.

[caption id=”attachment_1418” align=”aligncenter” width=”500”]Significato dei campi di una riga del file crontab. Significato dei campi di una riga del file crontab.[/caption]

Quindi per eseguire un comando al quindicesimo minuto di ogni ora bisogna inserire la riga

15	*	*	*	*	comando

mentre per farlo alle 2:00 di ogni lunedì

00	02	*	*	1	comando

Alcuni simboli permettono di specificare dei valori multipli in un campo. Il trattino “-“ indica un intervallo, per cui la riga

30 07	*	*	1-5	comando

esegue il comando alle 7:30 dal lunedì al venerdì.

La virgola “,” indica una lista di valori. Quindi

00	08	1,15,30		*	*	comando

esegue il comando specificato il giorno 1, 15 e 30 di ogni mese.

L’asterisco equivale a selezionare tutti i valori consentiti per il campo a cui si riferisce. Una riga come questa

*	*	*	*	*	echo "Tanti saluti da cron!"

istruisce cron ad eseguire il comando echo "Tanti saluti da cron!" una volta al minuto e per sempre!

Infine la barra “/” indica l’incremento del campo numerico, per cui

*	*/3	*	*	*	echo "Tanti saluti da cron!"

equivale a far eseguire il comando ogni 3 ore.

Tutto qui. Ci sono delle finezze ulteriori, ma chi fosse interessato può leggere qualche articolo specifico su cron, come questa pagina su Wikipedia1, o questo tutorial molto dettagliato.

Cron online

Per i più pigri esiste un servizio online che genera automaticamente la riga del file crontab corrispondente alle date e ore specificate tramite l’interfaccia web. Ma si fa prima ad imparare la sintassi di cron che ad orientarsi nella miriade di opzioni del servizio.

Molto più utile mi sembra il Cron Sandbox, un altro servizio online che consente di verificare che la lista di date e ore generate da una particolare riga del file crontab corrisponda a quanto ci si attende.

Al lavoro

Se vogliamo usare il comando cron per eseguire lo script ~/bin/makeblog e rigenerare automaticamente il blog “Pazzi per la mela” alle 2:00 di ogni notte, dobbiamo inserire nel file crontab la riga

00	02	*	*	*	~/bin/makeblog

e dimenticarci subito dopo della sua stessa esistenza. Cron lavorerà per noi ogni notte, preciso ed instancabile senza infastidirci, a meno che non decidiamo di andare a controllare quello che sta combinando.

E Lux?

Non mi sono dimenticato di Lux. Come già ricordato la volta scorsa, Lux vorrebbe poter scrivere i post del suo blog lasciando al sistema il compito di aggiornare i file html e di trasferirli sul server per la pubblicazione online. E vuole farlo indifferentemente dal Mac o dall’iPad (e perché no, anche dall’iPhone).

Con cron è semplice. Basterà mettere la directory contenente i vari pezzi del blog Octopress dentro la cartella di Dropbox del Mac 2 e creare lo script makeblog, configurando cron in modo da eseguirlo automaticamente all’ora desiderata.

Se Lux volesse poter aggiornare il blog quattro volte al giorno (esagerato!) alle ore 0, 6, 12 e 18, dovrebbe inserire in crontab la riga

00	*/6	*	*	*	~/bin/makeblog

oppure qualcosa di più specifico come

30	1,5,12,19	*	*	*	~/bin/makeblog

adattando così gli orari di aggiornamento ai propri ritmi di lavoro.

Ogni volta che Lux scrive un nuovo post con il Mac non dovrà fare altro che salvarlo nella directory giusta della sua installazione di Octopress, né più né meno di come fa già ora. Se invece usa l’iPad o l’iPhone, deve solo ricordarsi di inviare il post a Dropbox, scegliendo la stessa directory che usa sul Mac. Appena l’iPad si troverà connesso ad una rete, invierà il nuovo file a Dropbox, che lo spedirà a sua volta al Mac.

Tutto automatico, senza Apple Script, Azioni Cartelle, e mal di testa.

Conclusioni

Con cron the sky is the limit, o quasi. Io per anni ho fatto fare a cron il backup completo del contenuto di un sito web professionale, contenente centinaia di documenti e di programmi da distribuire agli utenti registrati, e del relativo database MySQL. Una volta scritto lo script che eseguiva il backup vero e proprio (questa è stata la cosa veramente complicata, visto che volevo mantenere backup multipli orari, giornalieri e mensili), ho lasciato fare a cron e… me ne sono letteralmente dimenticato.

Ma non finisce qui. La prossima volta mi toccherà parlare di launchd. Come potrei evitarlo, visto che questo blog è focalizzato (più o meno) sul Mac?

  1. Poteva mai mancare un riferimento ad una pagina di Wikipedia? MA non è certo colpa mia se Wikipedia è una delle cose migliori del web e che tante pagine sono fatte veramente bene. 

  2. Si potrebbe anche usare un collegamento simbolico o un altro servizio di condivisione dei file, ma non generalizziamo troppo. 

Sabino Maggi
Pubblicato da Sabino Maggi Segui
Commenti

Aggiungi un commento