Avviare il lancio per leggere correttamente gli argomenti del programma

Ho uno script di lancio where il command che sto cercando di eseguire sta errando (apparentemente non è una parola, è adesso), si lamentano di un uso improprio.

L'errore specifico che sto ottenendo è il text di utilizzo del command che viene scaricato nel registro di sistema. Da questo infero le altre informazioni (path al command, timing ecc.) Nel plist viene analizzato correttamente, non solo le opzioni del command.

Dopo l'utilizzo del command ho un'ultima row:

18/11/2013 09:30:00.101 com.apple.launchd.peruser.501: (fake.lable.seti[33833]) Exited with code: 1 

Ma questo significa solo "Sono uscito con un errore".

So che launchd divide il command dalle sue opzioni e nella pagina man parla di ProgramArguments: "… Si prega di notare: molte persone sono confuse da questa chiave. Si prega di leggere execvp (3) con molta attenzione! .."

Beh, ho letto execvp (3) e non sono il più saggio, quindi ti chiedo molto.

Normalmente, eseguire il command dal terminal sarebbe simile a questo:

 /Library/Application\ Support/BOINC\ Data/boinccmd --host localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update 

Questo funziona un piacere.

Ecco come ho diviso nella sezione Program / Program Arrangie del mio plist LaunchAgent:

 <key>Program</key> <string>/Library/Application Support/BOINC Data/boinccmd</string> <key>ProgramArguments</key> <arrays> <string>--host localhost</string> <string>--passwd gobbledygook</string> <string>--project http://setiathome.berkeley.edu/ update</string> </arrays> 

(per il record, ho originariamente avuto il path di boinccmd \ escaped out, ma questo non funziona, launchd sfugge gli spazi nel path per te)

Ho provato a dividere ulteriormente gli argomenti:

 <key>Program</key> <string>/Library/Application Support/BOINC Data/boinccmd</string> <key>ProgramArguments</key> <arrays> <string>--host</string> <string>localhost</string> <string>--passwd</string> <string>gobbledygook</string> <string>--project</string> <string>http://setiathome.berkeley.edu/</string> <string>update</string> </arrays> 

Ma anche questo non sembrava funzionare.

Come sempre, sono molto sicuro che manchi qualcosa di così semplice.

Grazie.


RISPOSTA:

La prima row di ProgramArguments deve essere il path del programma. Questo è ciò che mi stava avventurando e in effetti quello che era probabilmente inteso con il "… Si prega di leggere con molta attenzione! .." commento 🙂 Ho anche scoperto che ho dovuto dividere gli argomenti fino alle loro parti componenti. Quando avevo tutto quel posto, l'intera cosa fa un fascino. Grazie mille.

 <key>Program</key> <string>/Library/Application Support/BOINC Data/boinccmd</string> <key>ProgramArguments</key> <arrays> <string>/Library/Application Support/BOINC Data/boinccmd</string> <string>--host</string> <string>localhost</string> <string>--passwd</string> <string>gobbledygook</string> <string>--project</string> <string>http://setiathome.berkeley.edu/</string> <string>update</string> </arrays> 

Una modifica finale da dire per una spiegazione facile da capire per quale motivo dovrebbe essere, vedere la spiegazione di SirPavlova.

~ W

La chiave del Program specifica il file da eseguire e la chiave ProgramArguments specifica gli argomenti che verranno passati al process di esecuzione. In modo rigoroso si può passare a qualsiasi argomento che si desidera un process, ma la convenzione è che il primo dovrebbe essere il nome per cui il process è stato richiamato, quindi la maggior parte dei programmi ignora il loro primo argomento. Il file da eseguire è ovviamente necessario informazioni, ma se il codice del Program è mancante, launchd pnetworkingnde di avere lo stesso valore del primo argomento in ProgramArguments puramente come convenienza .

Il tuo primo esempio inizia il command boinccmd & gli fornisce argomenti equivalenti al command terminal

 --host\ localhost --passwd\ gobbledygook --project\ http://setiathome.berkeley.edu/\ update 

che dice a boinccmd di averlo chiamato come "host localhost" e passato solo due argomentazioni strane.

Il secondo esempio separa correttamente gli argomenti, ma come Eddie Kelley ha suggerito di aver bisogno di uno inserito nella parte anteriore. Dice a boinccmd che lo hai invocato come "host", poi ha passato altri sei argomenti. boinccmd può riconoscere le ultime cinque come due opzioni, ma non ha idea di cosa riguarda l'attività "localhost". Per quanto riguarda il boinccmd, è stato invocato dal terminal come

 /Library/Application\ Support/BOINC\ Data/boinccmd localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update 

(nota il mancante "–host").

boinccmd è probabilmente una delle gran maggioranza dei programmi che non import quale sia il loro primo argomento, quindi probabilmente potresti semplicemente spostare <string>HELLO</string> alla testa dell'arrays ProgramArguments , ma probabilmente è più pulito da rimuovere il tasto Program tutto e usi semplicemente questo:

 <key>ProgramArguments</key> <arrays> <string>/Library/Application Support/BOINC Data/boinccmd</string> <string>--host</string> <string>localhost</string> <string>--passwd</string> <string>gobbledygook</string> <string>--project</string> <string>http://setiathome.berkeley.edu/</string> <string>update</string> </arrays> 

Può sembrare una ridondanza senza significato, ma alcuni programmi lo usano per buon effetto: bash et al. agire come shell di login se il loro primo argomento inizia con - , & Vim entra in diverse modalità di emulazione se il suo primo argomento è ed o vi invece che vim .

Basato sulla pagina man per exec (3), sembra che il primo argomento del programma sia il path dell'eseguibile:

 The execv(), execvp(), and execvP() functions provide an arrays of pointers to null-terminated strings that represent the argument list available to the new program. The first argument, by convention, should point to the file name associated with the file being executed. The arrays of pointers must be terminated by a NULL pointer. 

Se è ansible specificare il path all'eseguibile come argomento all'indice 0, può aiutare …