J'ai un script launchd où la commande que j'essaie d'exécuter est en erreur (apparemment ce n'est pas un mot, c'est maintenant), se plaignant d'une mauvaise utilisation.
L'erreur spécifique que j'obtiens est le texte d'utilisation de la commande vidé dans le journal système. J'en déduis que les autres informations (chemin d'accès à la commande, timing, etc.) dans le plist sont analysées correctement, mais pas les options de la commande.
Après l'utilisation de la commande, j'ai une dernière ligne:
18/11/2013 09:30:00.101 com.apple.launchd.peruser.501: (fake.lable.seti[33833]) Exited with code: 1
Mais cela signifie simplement "je suis sorti avec une erreur".
Je sais que launchd sépare la commande de ses options et dans la page de manuel vous parle de ProgramArguments: "... Veuillez noter: beaucoup de gens sont confus par cette clé. Veuillez lire execvp (3) très attentivement! .."
Eh bien, j'ai lu execvp (3) et je ne suis pas plus sage, donc je vous demande beaucoup.
Normalement, en exécutant la commande à partir du terminal, cela ressemblerait à ceci:
/Library/Application\ Support/BOINC\ Data/boinccmd --host localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update
Cela fonctionne un régal.
Et voici comment je l'ai divisé dans la section Program / ProgramArguments de mon plist LaunchAgent:
<key>Program</key>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
<array>
<string>--host localhost</string>
<string>--passwd gobbledygook</string>
<string>--project http://setiathome.berkeley.edu/ update</string>
</array>
(pour mémoire, j'avais à l'origine le chemin vers boinccmd \ échappé, mais cela ne fonctionne pas, launchd échappe les espaces du chemin pour vous)
J'ai essayé de diviser davantage les arguments:
<key>Program</key>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
<array>
<string>--host</string>
<string>localhost</string>
<string>--passwd</string>
<string>gobbledygook</string>
<string>--project</string>
<string>http://setiathome.berkeley.edu/</string>
<string>update</string>
</array>
Mais cela ne semblait pas fonctionner non plus.
Comme toujours, je suis sûr que je manque quelque chose de si simple.
Merci.
RÉPONDRE:
La première ligne de ProgramArguments doit être le chemin d'accès au programme. C'est ce qui me trébuchait et en fait ce que l'on entendait probablement par le commentaire "... Veuillez lire très attentivement! .." :) J'ai également constaté que je devais diviser les arguments en leurs composants. Quand j'avais tout cela en place, tout cela fait un charme. Merci beaucoup.
<key>Program</key>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
<array>
<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>
</array>
Une dernière modification à dire pour une explication facile à comprendre pourQUOI cela devrait être, voir l'explication de SirPavlova.
~ W
<string>--host localhost</string>
ne fonctionnera certainement pas . N'oubliez pas que lorsque vous écrivez une ligne de commande dans un shell, il n'a aucune idée de ce qui fait partie d'une option et de ce qu'est un argument normal - il se divise simplement en espaces avant de passer les arguments au programme en cours d'exécution. En outre, il peut être utile d'afficher l'erreur exacteboinccmd
signalée.Réponses:
La
Program
clé spécifie le fichier à exécuter et laProgramArguments
clé spécifie les arguments qui seront transmis au processus d'exécution. À strictement parler, vous pouvez transmettre les arguments de votre choix à un processus, mais la convention est que le premier doit être le nom par lequel le processus a été appelé, donc la plupart des programmes ignorent leur premier argument. ‡ Le fichier à exécuter est évidemment une information nécessaire, mais si laProgram
clé est manquante, launchd prétend qu'il a la même valeur que le premier argument à titreProgramArguments
purement pratique .Votre premier exemple démarre boinccmd et lui donne des arguments qui seraient équivalents à la commande terminal
qui indique à boinccmd que vous l'avez invoqué en tant que "--host localhost" et que vous ne lui avez transmis que deux arguments étranges.
Votre deuxième exemple sépare correctement les arguments, mais comme Eddie Kelley l'a suggéré, il en a besoin d'un inséré à l'avant. Il indique à boinccmd que vous l'avez invoqué en tant que "--host", puis passé six autres arguments. boinccmd peut reconnaître les cinq dernières comme étant deux options, mais n'a aucune idée de ce qu'est l'activité "localhost". Pour autant que boinccmd puisse le dire, il a été appelé depuis le terminal comme
(notez le "--host" manquant).
boinccmd est probablement l'un de la grande majorité des programmes qui ne se soucient pas de leur premier argument, vous pouvez donc probablement simplement pousser
<string>HELLO</string>
en tête duProgramArguments
tableau, mais il est probablement plus propre de supprimer laProgram
clé et d'utiliser simplement ceci:‡ Cela peut sembler une redondance sans signification, mais certains programmes l'utilisent à bon escient: bash et al. agissent comme des shells de connexion si leur premier argument commence par
-
, et Vim entre dans différents modes d'émulation si son premier argument ested
ou à lavi
place devim
.la source
Sur la base de la page de manuel pour exec (3), il semble que le premier argument du programme devrait être le chemin vers l'exécutable:
Si vous pouvez spécifier le chemin d'accès à l'exécutable comme argument à l'index 0, cela peut aider ...
la source