Esecuzione di un comando ogni volta che Mac si avvia con launchctl / plist


5

Ho bisogno di correre nohup nice synergys -f --config ~/bin/conf/synergy.conf & comando quando il computer si avvia.

Come è scritto in questo post , Ho trovato il seguente codice plist.

<?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>synergy</string>
    <key>ProgramArguments</key>
    <array>
        <string>nohup nice /usr/bin/synergys -f --config /Users/USER/bin/conf/synergy.conf &</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>LaunchOnlyOnce</key>
    <true/>
</dict>
</plist>

E, ha eseguito questo comando.

launchctl load ./synergy.plist 

Tuttavia, ho ricevuto questo messaggio di errore.

launchctl: no plist was returned for: ./synergy.plist
launchctl: no plist was returned for: ./synergy.plist
nothing found to load

Cosa c'è che non va nel mio plist? O il mio comando launchctrl è sbagliato nelle opzioni?

Risposte:


12

Il problema immediato è che il tuo file .plist non è formattato correttamente - il contenuto di <string>...</string> dovrebbe essere codificato con entità HTML, ad es. & ha bisogno di essere codificato come &amp; (nota: puoi controllare il formato dei file .plist con plutil -lint filename.plist ). Ma ci sono altri cambiamenti che devono essere fatti ...

Avviare 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 avvolgi 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 non funziona con la tua versione 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 local. prefisso al nome del file (come ho fatto con l'etichetta) per conformarsi alla convenzione di denominazione DNS inverso.


1
OMG, grazie per questo: plutil -lint nomefile.plist
John Hinnegan

Ottimo consiglio per il plutil, molto utile
vdubgeek

Qual è la chiave Nice e intero 10 per?
hobbes3

C'è anche un motivo per cui non lo usi <key>Program</key><string>/usr/bin/synergys</string> quindi passare il resto degli argomenti come <key>ProgramArguments</key><array><string>Argument_1</string><string>Argument_2</string></array>?
hobbes3

1
@ hobbes3: The Nice valore esegue il programma con priorità ridotta, equivalente a bel comando nell'originale. Il motivo per cui non l'ho usato <key>Program</key> è ridondanza (e pigrizia): dovresti elencare /usr/bin/synergys come il Program e anche come il primo elemento di ProgramArguments.
Gordon Davisson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.