Ich habe ein launchd-Skript, in dem der Befehl, den ich ausführen möchte, fehlerhaft ist (anscheinend ist das kein Wort, es ist jetzt) und mich über eine missbräuchliche Verwendung beschwert.
Der spezifische Fehler, den ich erhalte, ist der Verwendungstext des Befehls, der in das Systemprotokoll geschrieben wird. Daraus schließe ich, dass die anderen Informationen (Pfad zum Befehl, Timing usw.) in der Liste korrekt analysiert werden, nur nicht die Optionen des Befehls.
Nach der Befehlsverwendung habe ich eine letzte Zeile:
18/11/2013 09:30:00.101 com.apple.launchd.peruser.501: (fake.lable.seti[33833]) Exited with code: 1
Das heißt aber nur "Ich bin mit einem Fehler ausgegangen".
Ich weiß, dass launchd den Befehl von seinen Optionen trennt und Sie in der Manpage über ProgramArguments informiert: "... Bitte beachten Sie: Viele Leute sind von diesem Schlüssel verwirrt. Bitte lesen Sie execvp (3) sehr sorgfältig! .."
Nun, ich habe execvp (3) gelesen und bin nicht der Klügere, also frage ich Sie sehr gerne.
Wenn Sie den Befehl vom Terminal aus ausführen, sieht er normalerweise so aus:
/Library/Application\ Support/BOINC\ Data/boinccmd --host localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update
Das ist ein Genuss.
Und so habe ich es in den Abschnitt Program / ProgramArguments meiner LaunchAgent-Liste aufgeteilt:
<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>
(Für den Datensatz hatte ich ursprünglich den Pfad zu boinccmd \ escaped, aber das funktioniert nicht, launchd entgeht Leerzeichen im Pfad für Sie)
Ich habe versucht, die Argumente weiter aufzuteilen:
<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>
Aber das schien auch nicht zu funktionieren.
Wie immer bin ich mir sehr sicher, dass mir etwas so Einfaches fehlt.
Vielen Dank.
ANTWORTEN:
Die erste Zeile von ProgramArguments muss der Pfad zum Programm sein. Dies ist, was mich auslöste und was wahrscheinlich mit dem Kommentar "... Bitte sehr sorgfältig lesen! .." gemeint war. Wenn ich das alles an Ort und Stelle hatte, wirkt das Ganze wie ein Zauber. Vielen Dank.
<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>
Eine letzte Änderung, die für eine leicht verständliche Erklärung, WARUM dies sein sollte, zu sagen ist, finden Sie in SirPavlovas Erklärung.
~ W
<string>--host localhost</string>
wird definitiv nicht funktionieren. Denken Sie daran, wenn Sie eine Befehlszeile in eine Shell schreiben, hat diese keine Ahnung, was Teil einer Option und was ein reguläres Argument ist - sie wird nur in Leerzeichen aufgeteilt, bevor die Argumente an das ausgeführte Programm übergeben werden. Es kann auch hilfreich sein, wenn Sie den genauen Fehler anzeigen, der boinccmd
gemeldet wird.