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

5

Ho bisogno di eseguire il comando nohup nice synergys -f --config ~/bin/conf/synergy.conf & ogni volta che 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?

    
posta prosseek 10.02.2011 - 22:59
fonte

1 risposta

12

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 &amp; (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.

    
risposta data 11.02.2011 - 02:43
fonte

Leggi altre domande sui tag