<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>File Plist on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/file-plist/</link>
    <description>Recent content in File Plist on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Tue, 28 Apr 2015 06:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/file-plist/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Automatizzare il Mac dal Terminale - Ancora Launchd</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2015/04/28/automatizzare-il-mac-dal-terminale-ancora-launchd/</link>
      <pubDate>Tue, 28 Apr 2015 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2015/04/28/automatizzare-il-mac-dal-terminale-ancora-launchd/</guid>
      <description>&lt;p&gt;A volte bisogna saper ammettere i propri errori. Questa è una di quelle volte.&lt;/p&gt;&#xA;&lt;p&gt;Nel mio &lt;a href=&#34;https://melabit.wordpress.com/2014/12/11/automatizzare-il-mac-dal-terminale-una-soluzione-targata-apple/&#34;&gt;post su launchd&lt;/a&gt; di qualche mese fa non avevo nascosto il mio scetticismo per una soluzione molto lontana dai &lt;a href=&#34;http://www.faqs.org/docs/artu/ch01s06.html&#34;&gt;canoni di Unix&lt;/a&gt; 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.&lt;/p&gt;&#xA;&lt;p&gt;Leggendo però &lt;a href=&#34;http://www.macstories.net/tutorials/how-i-control-my-mac-with-automatic-ifttt-dropbox/&#34;&gt;questo post su MacStories&lt;/a&gt;, mi sono reso conto dell&amp;rsquo;esistenza di una ulteriore opzione di launchd, &lt;code&gt;QueueDirectories&lt;/code&gt;, che permette di di tenere sotto controllo una (o più) &lt;a href=&#34;https://melabit.wordpress.com/le-parole-per-dirlo/&#34;&gt;directory&lt;/a&gt; del Mac e di eseguire automaticamente un comando ogni qualvolta si aggiunge un file alla directory osservata.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&#xA;Oltre a questa esiste una opzione più generale, &lt;code&gt;WatchPaths&lt;/code&gt;, 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.&lt;/p&gt;&#xA;&lt;p&gt;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&amp;rsquo;aggiunta di un file ad una directory o la modifica di un determinato file.&lt;/p&gt;&#xA;&lt;h4 id=&#34;launchd-losservatore&#34;&gt;Launchd, l&amp;rsquo;osservatore&lt;/h4&gt;&#xA;&lt;p&gt;Riprendiamo quindi il &lt;a href=&#34;http://en.wikipedia.org/wiki/Property_list&#34;&gt;file plist&lt;/a&gt; di configurazione del &lt;a href=&#34;https://melabit.wordpress.com/2014/12/11/automatizzare-il-mac-dal-terminale-una-soluzione-targata-apple/&#34;&gt;post precedente&lt;/a&gt; e vediamo cosa possiamo fare se aggiungiamo l&amp;rsquo;opzione &lt;code&gt;QueueDirectories&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Il punto di partenza è &lt;a href=&#34;https://melabit.wordpress.com/2014/12/11/automatizzare-il-mac-dal-terminale-una-soluzione-targata-apple/&#34;&gt;sempre lo stesso&lt;/a&gt;: vogliamo eseguire automaticamente lo script &lt;code&gt;~/bin/makeblog&lt;/code&gt; e &lt;a href=&#34;http://melabit.wordpress.com/2014/11/06/automatizzare-il-mac-dal-terminale-il-comando-at/&#34;&gt;rigenerare automaticamente il blog&lt;/a&gt; &amp;ldquo;Pazzi per la mela&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Questa volta però vogliamo rigenerare il blog non ad un&amp;rsquo;ora ben definita ed immutabile, ma solo quando inseriamo un nuovo post nella directory &lt;code&gt;~/Dropbox/blog/&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In questo caso usare Dropbox (o un qualunque servizio analogo, &lt;a href=&#34;https://www.box.com/&#34;&gt;Box&lt;/a&gt;, &lt;a href=&#34;https://www.copy.com&#34;&gt;Copy&lt;/a&gt;, &lt;a href=&#34;https://www.google.com/drive/&#34;&gt;Google Drive&lt;/a&gt;, o perfino &lt;a href=&#34;https://onedrive.live.com&#34;&gt;OneDrive&lt;/a&gt; di Microsoft) è particolarmente utile, perché permette di aggiungere il post anche lontano dal Mac, magari dopo averlo preparato sull&amp;rsquo;iPad o sull&amp;rsquo;iPhone.&lt;/p&gt;&#xA;&lt;p&gt;Il file plist di configurazione &lt;a href=&#34;https://melabit.wordpress.com/2014/12/11/automatizzare-il-mac-dal-terminale-una-soluzione-targata-apple/&#34;&gt;del post precedente&lt;/a&gt; diventa&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;#34;-//Apple//DTD PLIST 1.0//EN&amp;#34; &amp;#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;#34;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;plist&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;version=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Label&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;it.pazziperlamela.makeblog&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Program&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/bin/makeblog&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;QueueDirectories&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;array&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/Dropbox/blog/&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StandardOutPath&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/Documenti/makeblog.log&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StandardErrorPath&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/Documenti/makeblog.err&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;RunAtLoad&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;false/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per attivarlo, come abbiamo già visto, basta salvarlo nella directory &lt;code&gt;~/Library/LaunchAgents/&lt;/code&gt; del proprio account (dove il &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;simbolo &lt;code&gt;~&lt;/code&gt; indica la cartella &lt;code&gt;Inizio&lt;/code&gt;&lt;/a&gt; o &lt;code&gt;home&lt;/code&gt; dell&amp;rsquo;utente che sta usando il Mac) con il nome &lt;code&gt;it.pazziperlamela.makeblog.plist&lt;/code&gt; (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&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ launchctl load it.pazziperlamela.makeblog.plist&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Ai successivi riavvii sarà il sistema operativo ad eseguire periodicamente lo script.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Devo ammettere che le opzioni &lt;code&gt;QueueDirectories&lt;/code&gt; e  &lt;code&gt;WatchPaths&lt;/code&gt; 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.&lt;/p&gt;&#xA;&lt;p&gt;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 &lt;a href=&#34;http://www.linux.org/&#34;&gt;Linux&lt;/a&gt; e &lt;a href=&#34;http://www.bsd.org/&#34;&gt;BSD&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Però pragmaticamente mi rendo conto che in certe circostanze launchd può rivelarsi uno strumento utilissimo e senza eguali. Basta solo usarlo con moderazione.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Qualcosa di simile alle cosiddette &amp;ldquo;Folder Actions&amp;rdquo;, 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&amp;rsquo;ultima veniva aperta, chiusa o spostata.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Automatizzare il Mac dal Terminale - Una soluzione targata Apple</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/12/11/automatizzare-il-mac-dal-terminale-una-soluzione-targata-apple/</link>
      <pubDate>Thu, 11 Dec 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/12/11/automatizzare-il-mac-dal-terminale-una-soluzione-targata-apple/</guid>
      <description>&lt;p&gt;Dopo i programmi di derivazione Unix, &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/automatizzare-il-mac-dal-terminale-il-comando-at/&#34;&gt;&lt;code&gt;at&lt;/code&gt;&lt;/a&gt; e &lt;a href=&#34;https://melabit.wordpress.com/2014/11/22/automatizzare-il-mac-dal-terminale-sua-maesta-cron/&#34;&gt;&lt;code&gt;cron&lt;/code&gt;&lt;/a&gt;, è la volta di parlare di &lt;a href=&#34;http://launchd.info&#34;&gt;&lt;code&gt;launchd&lt;/code&gt;&lt;/a&gt;, una soluzione sviluppata dalla Apple per OS X.&lt;/p&gt;&#xA;&lt;h4 id=&#34;launchd&#34;&gt;Launchd&lt;/h4&gt;&#xA;&lt;p&gt;Launchd è il programma che, a partire dalla versione 10.4 (Tiger) di OS X, esegue tutti &lt;a href=&#34;http://en.wikipedia.org/wiki/Launchd&#34;&gt;i processi di avvio del sistema operativo&lt;/a&gt; e che, come se non bastasse, può anche svolgere i compiti eseguiti da cron.&lt;/p&gt;&#xA;&lt;p&gt;Launchd è stato sviluppato dalla Apple e, dopo qualche incomprensione, è stato rilasciato sotto la licenza open source Apache, con l&amp;rsquo;intento di promuoverne l&amp;rsquo;adozione anche sotto &lt;a href=&#34;https://github.com/freebsd/openlaunchd&#34;&gt;Linux e BSD&lt;/a&gt;.&#xA;Finora però &lt;a href=&#34;http://lwn.net/Articles/202779/&#34;&gt;l&amp;rsquo;accoglienza al di fuori di OS X&lt;/a&gt; è stata tiepida, se non peggio, e quindi al momento launchd rimane confinato al solo Mac.&lt;/p&gt;&#xA;&lt;p&gt;La cosa non mi stupisce.&lt;/p&gt;&#xA;&lt;p&gt;Al di là degli &lt;a href=&#34;http://www.reddit.com/r/debian/comments/1vm9ng/if_systemd_for_linux_why_not_launchd_for_kfreebsd/&#34;&gt;aspetti tecnici&lt;/a&gt; relativi al porting su altre piattaforme e focalizzando l&amp;rsquo;attenzione solo sull&amp;rsquo;utilizzo di launchd al posto di cron, sono perfettamente d&amp;rsquo;accordo con quanto è stato scritto tempo fa su &lt;a href=&#34;http://lowendmac.com&#34;&gt;Low End Mac&lt;/a&gt;, con il titolo significativo &lt;a href=&#34;http://lowendmac.com/2010/apples-launchd-is-anti-unix/&#34;&gt;Apple’s launchd Is Anti-Unix&lt;/a&gt; (&lt;em&gt;Launchd di Apple è anti-Unix&lt;/em&gt;).&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;One of the great things about Unix-like systems is that most of your skills, programs, dot files, and highly polished shell scripts are portable. I brought them with me to OS X after dragging them through a dozen or so Linux distributions…&lt;br&gt;&#xA;Consequently, I was distressed when launchd emerged from the dark side of One Infinite Loop…&lt;br&gt;&#xA;Merging periodically run jobs into the main system process doesn’t make sense. Replacing a simple /etc/crontab text file with multiple, awkwardly named XML plist files scattered among no less than four different directories is taking two big steps toward complexity.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Credo sia abbastanza chiaro anche così, ma lo traduco qui sotto perché ne condivido ogni parola.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;em&gt;Una delle cose migliori dei sistemi Unix è che la maggior parte delle competenze, dei programmi sviluppati, dei file di configurazione [detti &amp;ldquo;dot file&amp;rdquo; perché il nome di questi file inizia in genere con un punto] e degli &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;script di shell&lt;/a&gt; sono portatili [su piattaforme differenti]. Io me li sono portati dietro su OS X dopo averli fatti transitare per una dozzina di distribuzioni diverse di Linux&amp;hellip;&lt;br&gt;&#xA;Di conseguenza mi preoccupa vedere launchd emergere dalla faccia oscura di &lt;a href=&#34;https://www.google.it/maps/place/Infinite&amp;#43;Loop,&amp;#43;Cupertino,&amp;#43;CA&amp;#43;95014,&amp;#43;Stati&amp;#43;Uniti/data=!4m2!3m1!1s0x808fb5b6e7b4b9fb:0x697a4332574f50d9?sa=X&amp;amp;ei=wb-GVK_rBYbAOazIgXA&amp;amp;ved=0CCcQ8gEwAA&#34;&gt;One Infinite Loop&lt;/a&gt; [l&amp;rsquo;indirizzo della Apple]&amp;hellip;&lt;br&gt;&#xA;Non ha senso mescolare processi eseguiti periodicamente con il processo principale [di inizializzazione] del sistema operativo. Sostituire un semplice file di testo /etc/crontab con una serie di file plist in formato XML con nomi assurdi e distribuiti su almeno quattro directory diverse è un bel passo avanti [sarebbero due, ma in italiano non viene bene] verso la complessità&amp;hellip;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h4 id=&#34;launchd-contro-cron&#34;&gt;Launchd contro cron&lt;/h4&gt;&#xA;&lt;p&gt;Se consideriamo il semplice obiettivo di rendere automatiche certe attività ripetitive sul Mac, la chiave del discorso sta proprio nell&amp;rsquo;ultima frase citata:&#xA;&amp;ldquo;&lt;em&gt;Sostituire un semplice file di testo /etc/crontab con una serie di file plist in formato XML con nomi assurdi, distribuiti su almeno quattro directory diverse è un bel passo avanti verso la complessità&lt;/em&gt;&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Launchd è molto più complicato di cron, inutilmente più complicato. Basta usarlo un po&amp;rsquo; per accorgersene.&lt;/p&gt;&#xA;&lt;p&gt;Proviamo a sostituire launchd a cron per eseguire lo script &lt;code&gt;~/bin/makeblog&lt;/code&gt; e &lt;a href=&#34;http://melabit.wordpress.com/2014/11/06/automatizzare-il-mac-dal-terminale-il-comando-at/&#34;&gt;rigenerare automaticamente il blog&lt;/a&gt; &amp;ldquo;Pazzi per la mela&amp;rdquo; alle 2:00 di ogni notte.&lt;/p&gt;&#xA;&lt;p&gt;Con cron basta solo aggiungere &lt;a href=&#34;https://melabit.wordpress.com/2014/11/22/automatizzare-il-mac-dal-terminale-sua-maesta-cron/&#34;&gt;al file crontab&lt;/a&gt; la riga seguente&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;00&#x9;02&#x9;*&#x9;*&#x9;*&#x9;~/bin/makeblog&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Se invece si vuole utilizzare launchd, bisogna creare un &lt;a href=&#34;http://en.wikipedia.org/wiki/Property_list&#34;&gt;file plist&lt;/a&gt; di configurazione in &lt;a href=&#34;http://en.wikipedia.org/wiki/XML&#34;&gt;linguaggio XML&lt;/a&gt; più o meno come questo,&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;#34;-//Apple//DTD PLIST 1.0//EN&amp;#34; &amp;#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;#34;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;plist&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;version=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Label&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;it.pazziperlamela.makeblog&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;ProgramArguments&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;array&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/bin/makeblog&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StartCalendarInterval&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Hour&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;integer&amp;gt;&lt;/span&gt;02&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/integer&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Minute&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;integer&amp;gt;&lt;/span&gt;00&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/integer&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StandardOutPath&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/Documenti/makeblog.log&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StandardErrorPath&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/Documenti/makeblog.err&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;RunAtLoad&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;false/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;salvarlo nella directory &lt;code&gt;~/Library/LaunchAgents/&lt;/code&gt; del proprio account (&lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;la &lt;code&gt;~&lt;/code&gt; indica la cartella &lt;code&gt;Inizio&lt;/code&gt;&lt;/a&gt; o &lt;code&gt;home&lt;/code&gt; dell&amp;rsquo;utente che sta usando il Mac) usando obbligatoriamente il nome &lt;code&gt;it.pazziperlamela.makeblog.plist&lt;/code&gt; (il nome del file deve essere uguale a quello senza estensione utilizzato alla riga 6 del file plist), e infine eseguirlo una prima volta dal Terminale con il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ launchctl load it.pazziperlamela.makeblog.plist&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Per fortuna ai successivi riavvii ci pensa il sistema operativo ad eseguire periodicamente lo script.&lt;/p&gt;&#xA;&lt;h4 id=&#34;un-brevissimo-tutorial&#34;&gt;Un brevissimo tutorial&lt;/h4&gt;&#xA;&lt;p&gt;Può essere utile descrivere brevemente le informazioni essenziali da inserire nel file plist di configurazione, in modo che il processo automatico gestito da launchd funzioni correttamente. Per ulteriori informazioni, consiglio la lettura di &lt;a href=&#34;http://launchd.info&#34;&gt;quest&amp;rsquo;ottimo tutorial&lt;/a&gt; e delle specifiche dettagliate &lt;a href=&#34;https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/launchd.plist.5.html&#34;&gt;del formato del file plist&lt;/a&gt; usato da launchd.&lt;/p&gt;&#xA;&lt;p&gt;Le prime tre righe del file specificano tipo e versione dei formati xml e plist utilizzati, e vanno copiate esattamente come sono scritte nell&amp;rsquo;esempio precedente.&lt;/p&gt;&#xA;&lt;p&gt;Il file plist deve contenere tre chiavi obbligatorie. La prima, &lt;code&gt;Label&lt;/code&gt; (riga 5), serve per specificare il nome del file plist stesso, senza estensione. Nel nostro caso il nome del file è &lt;code&gt;it.pazziperlamela.makeblog&lt;/code&gt; (riga 6).&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;La chiave &lt;code&gt;ProgramArguments&lt;/code&gt; (riga 8) serve invece per specificare il percorso e il nome dello script di shell da eseguire. Qui è &lt;code&gt;/Users/utente/bin/makeblog&lt;/code&gt;, dove al posto di &lt;code&gt;utente&lt;/code&gt; bisogna sostituire il nome breve del proprio account. Il modo più semplice per ottenere il proprio nome breve è eseguire da Terminale il comando &lt;code&gt;whoami&lt;/code&gt; (oppure &lt;code&gt;id -un&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;ultima chiave obbligatoria, &lt;code&gt;StartCalendarInterval&lt;/code&gt; (riga 13), definisce ora e minuto (oltre che eventualmente giorno della settimana, giorno e mese) in cui launchd deve eseguire lo script di shell. In alternativa si può usare la chiave &lt;code&gt;StartInterval&lt;/code&gt;, che lancia invece lo script ogni certo numero di secondi, a partire dalla prima esecuzione del processo tramite launchctl.&lt;/p&gt;&#xA;&lt;p&gt;Due ulteriori chiavi opzionali, &lt;code&gt;StandardOutPath&lt;/code&gt; e &lt;code&gt;StandardErrorPath&lt;/code&gt; (righe 21 e 24), definiscono rispettivamente il percorso dei file da usare per salvare l&amp;rsquo;output completo generato dal comando e gli eventuali messaggi di errore. Anche in questo caso bisogna sostituire nel percorso dei file il proprio nome breve al posto dell&amp;rsquo;&lt;code&gt;utente&lt;/code&gt; generico.&lt;/p&gt;&#xA;&lt;p&gt;Un&amp;rsquo;altra utile chiave opzionale è &lt;code&gt;RunAtLoad&lt;/code&gt; (riga 27), che specifica se lo script di shell deve essere eseguito al momento del caricamento da parte di launchctl.&#xA;Questa opzione è inutile se, come in questo caso, si definiscono esattamente gli orari di esecuzione del processo tramite la chiave &lt;code&gt;StartCalendarInterval&lt;/code&gt;.&#xA;Se invece si usa la chiave &lt;code&gt;StartInterval&lt;/code&gt;, bisogna impostare&#xA;&lt;code&gt;RunAtLoad&lt;/code&gt; al valore &lt;code&gt;true/&lt;/code&gt;, in modo da fissare il tempo iniziale da cui far partire il conteggio dei secondi.&lt;/p&gt;&#xA;&lt;h4 id=&#34;due-comandi-utili&#34;&gt;Due comandi utili&lt;/h4&gt;&#xA;&lt;p&gt;Per elencare tutti i processi gestiti da launchd in un dato momento si esegue da Terminale il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ launchctl list&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Il Mac su cui sto scrivendo questo post elenca ben 294 processi, considerando sia i processi attivi che quelli ormai terminati.&lt;/p&gt;&#xA;&lt;p&gt;Per smettere di eseguire automaticamente lo script &lt;code&gt; it.pazziperlamela.makeblog.plist&lt;/code&gt;, si deve eseguire il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ launchctl unload ~/Library/LaunchAgents/it.pazziperlamela.makeblog.plist&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e poi cancellare (o spostare) il file &lt;code&gt;it.pazziperlamela.makeblog.plist&lt;/code&gt; dalla directory &lt;code&gt;~/Library/LaunchAgents/&lt;/code&gt;. In caso contrario, lo script tornerà ad essere lanciato automaticamente al prossimo riavvio.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;È evidente che non mi piace l&amp;rsquo;idea di usare launchd al posto di cron. Troppo complicato e troppo proprietario. Una vera pugnalata ad uno dei principi cardini di Unix (e del software ben fatto): fare una cosa sola ma farla bene e in modo efficiente.&lt;/p&gt;&#xA;&lt;p&gt;Intendiamoci, launchd va benissimo per gestire l&amp;rsquo;avvio del sistema e i servizi automatici (i &lt;em&gt;demoni&lt;/em&gt;) gestiti dal sistema operativo e dalla sua introduzione in (Mac) OS X 10.4/Tiger ha reso molto più veloce il processo di avvio di OS X. Ma sostituire launchd a cron introduce un livello di complessità inutile ed insensato.&lt;/p&gt;&#xA;&lt;p&gt;Nonostante tutto c&amp;rsquo;è &lt;a href=&#34;http://paul.annesley.cc/2012/09/mac-os-x-launchd-is-cool/&#34;&gt;qualcuno a cui launchd piace&lt;/a&gt; anche per questo scopo. Contento lui, io finché posso preferisco tenermi stretto il buon vecchio cron.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Il formato consigliato per il nome del file plist è il cosiddetto &lt;a href=&#34;https://developer.apple.com/library/mac/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_conc/understand_utis_conc.html&#34;&gt;&lt;code&gt;Uniform Type Identifier&lt;/code&gt; (UTI)&lt;/a&gt;, una struttura simile a quella di un &lt;a href=&#34;http://it.wikipedia.org/wiki/Domain_Name_System&#34;&gt;dominio web&lt;/a&gt; inverso. In questo caso è stato preso il nome dello script da eseguire &lt;code&gt;makeblog&lt;/code&gt;, lo si è aggiunto all&amp;rsquo;indirizzo del (presunto) sito web del progetto &lt;code&gt;pazziperlamela.it&lt;/code&gt;, e infine si è invertito l&amp;rsquo;ordine della stringa risultante, &lt;code&gt;makeblog.pazziperlamela.it&lt;/code&gt;, ottenendo il nome del file plist.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
  </channel>
</rss>
