Il problema immediato è che il tuo file .plist non è formattato correttamente - il contenuto di <string>...</string>
deve essere codificato con entità HTML, ovvero &
deve essere codificato come &
(nota: puoi controllare il formato dei file .plist con plutil -lint filename.plist
). Ma ci sono altri cambiamenti che devono essere fatti ...
Avviare i programmi con launchd è piuttosto diverso che avviarli da una shell. La più grande differenza è che dalla shell, vuoi che il programma vada in background ed esegua indipendentemente dalla shell, quindi lo sposti in nohup ... &
. Con launchd, in realtà è meglio che il programma rimanga nel "primo piano", quindi launchd può tenerlo d'occhio.
Inoltre, gli elementi di ProgramArguments non verranno analizzati da una shell, quindi l'elenco del comando e dei relativi argomenti con spazi tra di essi non funziona: rendere ciascun argomento un elemento separato dell'array.
Ecco la mia pugnalata a una sinergia. Non ho provato questo, quindi potrebbe essere necessario un piccolo ritocco per funzionare correttamente (vedi note sotto):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>local.synergy</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/synergys</string>
<string>-f</string>
<string>--config</string>
<string>/Users/USER/bin/conf/synergy.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>Nice</key>
<integer>10</integer>
<key>KeepAlive</key>
<false/>
<key>AbandonProcessGroup</key>
<true/>
</dict>
</plist>
Le ultime due chiavi sopra trattano di come launchd dovrebbe reagire se / quando il programma synergys viene chiuso. Per impostazione predefinita, elimina tutti i sottoprocessi sopravvissuti e avvia una nuova istanza; questi due tasti sopprimono entrambe le parti, che possono o non possono essere quello che vuoi. Inoltre, una cosa che non funziona è che la tua versione con nohup
fa reindirizzare stdin e stdout su nohup.out (nel caso che il terminale vada via); invece IIRC launchd registra le cose che vengono inviate a loro. Se synergys è in grado di inviare output, potresti voler aggiungere qualcosa di simile a .plist:
<key>StandardOutPath</key>
<string>/dev/null</string>
<key>StandardErrorPath</key>
<string>/dev/null</string>
Inoltre, come detto da mankoff, dovresti metterlo in ~ / Library / LaunchAgents in modo che venga caricato automaticamente ogni volta che accedi. Oh, e dovresti probabilmente aggiungere un prefisso local.
al nome del file (come ho fatto io con l'etichetta) per conformarsi alla convenzione di denominazione DNS inversa.