Qualche giorno fa Lucio “Lux” Bragagnolo ha pubblicato sul suo interessantissimo blog (da seguire assolutamente ogni giorno!), un post in cui poneva una domanda molto stimolante. Lascio a lui la parola per descrivere il problema:
Octopress – il motore di questo blog – si basa su una cartella che risiede nel Mac. La cartella contiene sottocartelle varie che ospitano i pezzi del blog. Pubblicare questo articolo significa creare un file e metterlo nella giusta cartella, per poi dare un comando di Terminale che genera una edizione aggiornata del blog e un altro comando di Terminale che deposita una copia dell’edizione dentro il server di pubblicazione.
Spesso mi trovo a scrivere pezzi per il blog su iPad, lontano da Mac. Facciamo finta che il Mac rimanga irraggiungibile fisicamente per tutta la giornata. Qual è la strategia che richiede meno lavoro in assoluto per pubblicare il pezzo?
Detto in modo più generale, la domanda di Lux è:
quali strumenti possono essere usati sul Mac per automatizzare determinate attività nel modo più semplice e veloce possibile?
Nella discussione che è seguita sul blog il mio incontrollabile alter ego virtuale ha proposto velocemente due o tre possibili soluzioni, promettendo anche di approfondirle appena possibile.
Credo che questo sia lo spazio migliore per farlo, tornando finalmente a discutere di argomenti connessi alla programmazione e alla amministrazione del Mac, dopo parecchio (troppo!) tempo dedicato a divagazioni più o meno lontane dal target principale del blog.
Introduzione
Sul Mac sono disponibili diversi strumenti che permettono di automatizzare le operazioni effettuate sul sistema. Mi concentrerò qui sui comandi di derivazione Unix presenti di default in OS X, perché sono strumenti ben testati ed affidabili e sono utilizzabili anche su piattaforme diverse dal Mac.
Avrei voluto concentrare la discussione in un unico post, ma mi sono accorto che raggiunto una lunghezza eccessiva e difficile da digerire in una sola volta.
Ho deciso quindi di dividere la trattazione in più parti distinte. In questa prima parte mostrerò l’uso di at
, il comando più semplice disponibile su OS X per questo scopo.
Nei prossimi post mostrerò l’utilizzo di strumenti più avanzati come cron
e launchd
. Cercherò poi di descrivere ulteriori prodotti di terze parti ed eventualmente anche una soluzione basata su Automator (ammesso che questa sia in grado di fare al meglio quanto richiesto, cosa di cui non sono troppo sicuro in questo momento).
Per evitare di essere troppo vago cercherò di circoscrivere il problema, basandomi strettamente su quanto richiesto da Lux, ma provando anche a rendere facile l’estensione di quanto descritto a casi più generali.
Pazzi per la mela
Supponiamo di voler automatizzare la pubblicazioni dei nuovi post sul blog “Pazzi per la mela”, raggiungibile all’indirizzo IP http://pazziperlamela.it (inutile cliccare sul link, il blog non esiste).
Pazzi per la mela utilizza Octopress per convertire i file di testo che costituiscono ciascun post in pagine html statiche, che devono essere poi copiate sul server remoto che gestisce il sito web del blog.
Sul Mac, tutti i testi dei post e i file di configurazione del blog si trovano nella cartella ~/Documenti/pazziperlamela/
, dove ~
indica per convenzione la cartella Inizio
(o home
) dell’utente del Mac, identificata nel Finder dall’icona di una casetta.
Ogni volta che si aggiungono nuovi post o si modificano quelli già esistenti, bisogna rigenerare le pagine html, eseguendo dal Terminale i comandi
$ cd Documenti/pazziperlamela/
per posizionarsi all’interno della cartella del blog, e poi
$ rake generate
per ricreare sul Mac le pagine html che costituiscono il sito web del blog. Un ulteriore comando
$ rake deploy
sincronizza le pagine html modificate con il server remoto tramite rsync
, probabilmente il migliore strumento di sincronizzazione bidirezionale fra un server remoto e il sistema locale.
Mettiamo insieme questi comandi creando un semplice script di shell,
#!/bin/bash
cd ~/Documenti/pazziperlamela/
rake generate
rake deploy
salviamolo in ~/bin
con il nome makeblog
e rendiamolo eseguibile (le istruzioni dettagliate si trovano in Script di shell in OS X).
E arriviamo finalmente alla parte centrale del post.
Supponiamo di voler rigenerare automaticamente il blog “Pazzi per la mela” una volta al giorno, magari alle 2:00 di notte per evitare che troppi lettori siano collegati nel momento in cui vengono modificate le pagine del blog.
Vediamo come farlo, usando il comando più semplice presente sul Mac
Un comando semplice semplice
Lo strumento più semplice che possiamo usare sul Mac per automatizzare determinate operazioni è at
, che esegue uno o più comandi alla data e ora specificata. La sintassi di at
adatta a questo scopo è
$ at -f script -m ora data
dove script
è il nome dello script di shell contenente i comandi da eseguire, mentre ora e data possono essere specificate sia in modo assoluto, ad esempio “02:00” oppure “02:00 Nov 06” (senza virgolette), che in modo relativo, “now + 1 minute”, “tomorrow”.
In alternativa si può specificare la data e l’ora in formato POSIX,
$ at -f comando -m -t YYYYMMDDhhmm
cioè scrivendola al contrario di come siamo abituati, iniziando dall’anno e finendo con i minuti. Qui YYYY indica l’anno, MM il numero del mese, DD il giorno, infine hh e mm l’ora e i minuti. Tutti gli elementi della data vanno inseriti usando due (o quattro) cifre e facendoli precedere eventualmente da uno zero. In questo formato, il 6 Novembre alle ore 2:00 diventa “201411060200”
Per motivi che mi sfuggono, il comando at
è disabilitato di default in OS X. Per attivarlo bisogna eseguire da Terminale
$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist
dopo di che il comando at
rimarrà disponibile anche riavviando il Mac.
Si può ora utilizzare at
per eseguire automaticamente lo script di shell makeblog
all’ora desiderata, scrivendo nel Terminale
$ at -f ~/bin/makeblog -m 02:00 tomorrow
Il Terminale (o meglio bash
) ci risponderà con l’indicazione della data e dell’ora completa alla quale verrà eseguito lo script. Dopo averlo completato, inoltre, bash
sarà tanto gentile da inviarci una email con l’output completo prodotto dallo script.
A meno di non configurare opportunamente il servizio di posta elettronica interno di OS X (una cosa che va ben oltre gli scopi di questo post), questa email però non riuscirà a raggiungere la nostra abituale casella di posta elettronica. Potrà però essere letta dal Terminale con il comando (poteva essere diversamente?) mail
.
Troppo semplice per essere utile?
Purtroppo il comando at
non è adatto a soddisfare quanto richiesto da Lux.
Infatti, dopo aver finito di scrivere un nuovo post, Lux dovrebbe comunque lanciare il Terminale e configurare at
in modo da fargli eseguire lo script makeblog
alle due della notte successiva. Se invece sta usando l’iPad, dovrebbe collegarsi tramite ssh
al Mac e fare la stessa cosa da remoto.
Ma, avendo accesso al Terminale, e indipendentemente dal fatto che avvenga in locale o in remoto, è molto più semplice eseguire direttamente lo script makeblog
, senza complicarsi ulteriormente la vita.
Quindi at
non serve a niente?
Certo che at
serve (altrimenti che senso avrebbe avuto scrivere questo post?). Ma serve nei casi in cui si vuole eseguire una determinata attività sul Mac automaticamente e una volta sola, mantenendo il pieno controllo del momento esatto in cui viene fatta partire.
Se invece vogliamo eseguire un’attività periodicamente e quasi dimenticandocene, at
non serve e bisogna usare per forza di cose degli strumenti più avanzati.
Il mio incontro con at
Sono sicuro di non aver mai usato finora at
su OS X, ma questo comando mi è stato utilissimo diversi anni fa, quando ho avuto accesso a delle favolose workstation Sun.
All’epoca dovevo eseguire delle simulazioni che duravano parecchie ore. Un semplice PC era improponibile: non solo perché era troppo lento, ma anche perché c’era sempre qualcuno che, zelante, lo spegneva la sera passandoci davanti (nonostante tutti i cartelli di avviso che potevo mettere davanti al monitor).
Un amico grande esperto di Unix (ho imparato i fondamenti da lui!) mi permise allora di usare le workstation Sun del laboratorio di elaborazione video che gestiva.
Per ottimizzare l’uso delle macchine e non dare fastidio agli altri utenti, dovevo però lanciare le simulazioni di notte, quando i sistemi erano quasi inattivi. Passavo poi gran parte della giornata successiva a controllare e ad elaborare i dati prodotti durante la notte e a preparare i file di configurazione per le successive elaborazioni notturne.
Questo ciclo, preparazione-calcolo-elaborazione, mi impediva di usare cron
(un comando che vedremo la prossima volta), che avrebbe eseguito ciecamente le simulazioni ogni notte al momento stabilito, anche nei week-end o nei giorni in cui per qualche motivo non ero riuscito ad elaborare i dati.
Invece at
era perfetto per questo scopo. Una volta completata la scrittura dei nuovi file di configurazione, li trasferivo tramite rete locale sulle Sun e configuravo at
in modo da eseguire un nuovo ciclo di simulazioni la notte successiva. Semplice e veloce.
Accessori ma sempre utili
Fra i comandi di supporto di at
, sono particolarmente utili atq
, che permette di elencare i comandi at
in attesa di essere eseguiti, e atrm
seguito da un numero intero, che cancella il comando at
in coda identificato dal numero intero associato. Ad esempio
$ atq
35 Thu Nov 6 02:00:00 2014
36 Thu Nov 6 06:00:00 2014
37 Sat Nov 15 12:15:00 2014
$ atrm 36
$ atq
35 Thu Nov 6 02:00:00 2014
37 Sat Nov 15 12:15:00 2014
Se si vuole disabilitare di nuovo at
, bisogna eseguire da Terminale
$ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.atrun.plist
Conclusioni
In questo lungo post abbiamo visto il più semplice comando che può essere utilizzato per automatizzare determinate attività sul Mac.
Nel prossimo post affronteremo cron
, il re indiscusso degli strumenti adatti a questo scopo.