programmazione,

Automatizzare il Mac dal Terminale - Ancora Launchd

Sabino Maggi Sabino Maggi Segui 28-Apr-2015 · 3 minuti di lettura
Condividi

A volte bisogna saper ammettere i propri errori. Questa è una di quelle volte.

Nel mio post su launchd di qualche mese fa non avevo nascosto il mio scetticismo per una soluzione molto lontana dai canoni di Unix e troppo complicata per essere usata al posto di cron, il programma che nei sistemi operativi derivati da Unix è incaricato di eseguire periodicamente dei comandi o degli interi script in modo automatico.

Leggendo però questo post su MacStories, mi sono reso conto dell’esistenza di una ulteriore opzione di launchd, QueueDirectories, che permette di di tenere sotto controllo una (o più) directory del Mac e di eseguire automaticamente un comando ogni qualvolta si aggiunge un file alla directory osservata.1 Oltre a questa esiste una opzione più generale, WatchPaths, che permette di tenere sotto controllo uno o più file (o directory) ed eseguire un comando quando uno di questi file (o directory) viene modificato.

Con queste due nuove (almeno per me!) opzioni si può estendere notevolmente il campo di applicazione di launchd, facendogli eseguire un comando o uno script non solo in modo periodico (in sostituzione di cron), ma anche al verificarsi di un evento come l’aggiunta di un file ad una directory o la modifica di un determinato file.

Launchd, l’osservatore

Riprendiamo quindi il file plist di configurazione del post precedente e vediamo cosa possiamo fare se aggiungiamo l’opzione QueueDirectories.

Il punto di partenza è sempre lo stesso: vogliamo eseguire automaticamente lo script ~/bin/makeblog e rigenerare automaticamente il blog “Pazzi per la mela”.

Questa volta però vogliamo rigenerare il blog non ad un’ora ben definita ed immutabile, ma solo quando inseriamo un nuovo post nella directory ~/Dropbox/blog/.

In questo caso usare Dropbox (o un qualunque servizio analogo, Box, Copy, Google Drive, o perfino OneDrive di Microsoft) è particolarmente utile, perché permette di aggiungere il post anche lontano dal Mac, magari dopo averlo preparato sull’iPad o sull’iPhone.

Il file plist di configurazione del post precedente diventa

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>it.pazziperlamela.makeblog</string>
	
	<key>Program</key>
	<string>/Users/utente/bin/makeblog</string>
	
	<key>QueueDirectories</key>
	<array>
    	<string>/Users/utente/Dropbox/blog/</string>
	</array>
	
	<key>StandardOutPath</key>
	<string>/Users/utente/Documenti/makeblog.log</string>
	
	<key>StandardErrorPath</key>
	<string>/Users/utente/Documenti/makeblog.err</string>

	<key>RunAtLoad</key>
	<false/>
</dict>
</plist>

Per attivarlo, come abbiamo già visto, basta salvarlo nella directory ~/Library/LaunchAgents/ del proprio account (dove il simbolo ~ indica la cartella Inizio o home dell’utente che sta usando il Mac) con il nome it.pazziperlamela.makeblog.plist (il nome del file deve essere uguale a quello senza estensione utilizzato alla riga 6 del file plist), ed eseguirlo una prima volta dal Terminale con il comando

$ launchctl load it.pazziperlamela.makeblog.plist

Ai successivi riavvii sarà il sistema operativo ad eseguire periodicamente lo script.

Conclusioni

Devo ammettere che le opzioni QueueDirectories e WatchPaths rendono launchd molto più interessante di quanto mi sia mai reso conto, permettendo di eseguire dei comandi di sistema o degli interi script in modo asincrono, al verificarsi di eventi particolari come la scrittura o la modifica di un file in una directory.

Intendiamoci, le mie riserve sulla complessità di launchd rimangono intatte. Inoltre continua a non piacermi il fatto che sia uno strumento confinato al solo OS X, con poche prospettive di diffusione al di fuori del mondo Apple fra i sistemi operativi derivati da Unix, come Linux e BSD.

Però pragmaticamente mi rendo conto che in certe circostanze launchd può rivelarsi uno strumento utilissimo e senza eguali. Basta solo usarlo con moderazione.

  1. Qualcosa di simile alle cosiddette “Folder Actions”, introdotte già da parecchi anni in OS X senza troppo successo, che istruivano il sistema operativo a tenere sotto controllo una directory e ad eseguire dei comandi AppleScript o Automator ogni volta che un file veniva aggiunto o rimosso da quella directory, oppure quando quest’ultima veniva aperta, chiusa o spostata. 

Sabino Maggi
Pubblicato da Sabino Maggi Segui
Commenti

Aggiungi un commento