Automatizzare il Mac dal Terminale – Il comando at

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.

Advertisements
Tagged with: , , , , ,
Pubblicato su programmazione

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Informativa
Questo sito utilizza cookie di terze parti per inviarti pubblicità e servizi in linea con le tue preferenze. Se vuoi saperne di più o negare il consenso a tutti o ad alcuni cookie, clicca qui. Scorrendo questa pagina, cliccando su un link o su qualunque altro elemento o proseguendo la navigazione in altra maniera, acconsenti all'uso dei cookie.
Follow MelaBit on WordPress.com
Categorie
Archivi
%d blogger hanno fatto clic su Mi Piace per questo: