OS X: LaunchDaemon läuft nicht: Dienst konnte nicht initialisiert werden

10449
nickcoxdotme

Ich habe Apples scheinbar unkomplizierte Dokumente verwendet, um ein LaunchDaemon zu erstellen, um ein von mir geschriebenes Node.js-Skript auszuführen.

Hier ist die plistDatei. Es ist im Grunde genau ein Copy-Paste aus den Dokumenten von Apple, das alle 300 Sekunden ausgeführt wird:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.wintr.eodemail</string> <key>ProgramArguments</key> <array> <string>~/projects/eod_email/eod</string> </array> <key>StartInterval</key> <integer>300</integer> <key>StandardOutPath</key> <string>/var/log/eod-email.log</string> <key>StandardErrorPath</key> <string>/var/log/eod-email.log</string> <key>Debug</key> <true/> </dict> </plist> 

Hier ist der Fehler, den ich bekomme /var/log/system.log:

Jul 22 10:55:52 Nick-Cox com.apple.xpc.launchd[1] (com.wintr.eodemail[7097]): Service could not initialize: 14E46: xpcproxy + 13421 [1402][7D917364-B96E-3F93-B923-A89B5BF5736D]: 0x2 

Was ich getan habe:

  • Es verfügt über die gleichen Berechtigungen wie die übrigen Dateien in / Library / LaunchDaemons ( -rw-r--r--im Besitz von root).
  • Ich habe die Dokumente für xpc gelesen, aber das hat nicht viel geholfen.
  • Ich stellte sicher, dass das Node.js-Skript ausreichend permissiv war (777) und von der Befehlszeile aus ausgeführt werden konnte (ist es).
  • Versuchte den absoluten Pfad zur Datei ( /Users/nickcox/projects/eod_email/eod) und stellte sicher, dass ich lief launchctl unload (daemonname)undlaunchctl load (daemon name)

Dies scheint viel komplizierter als cron zu sein, was laut Apple-Dokumenten anscheinend veraltet ist. Was muss ich tun, damit dieses Skript nach einem Zeitplan ausgeführt wird?

7
Tilde-Erweiterung funktioniert nicht in 10.10 und höher (zumindest das weiß ich). Verwenden Sie den absoluten Pfad. Ihre Skript-Perms sollten 755 sein. Und ich denke, dass JavaScriptCore nicht daemon-sicher ist. fd0 vor 9 Jahren 0
Siehe Kommentar zum absoluten Pfad in "Was ich getan habe." Und es sollte keine Rolle spielen, ob die Skript-Perms _overly_ permissiv sind, oder? Es würde nur nicht funktionieren, wenn es nicht tolerant genug wäre, richtig? Aber bis zum letzten Punkt, wenn das der Fall ist, habe ich kein Glück? nickcoxdotme vor 9 Jahren 0
Ich empfehle Ihnen, die technischen Hinweise TN2083 zu lesen. Die Dokumentation bleibt hinter dem sich ständig ändernden Launchd zurück. fd0 vor 9 Jahren 0
Für jeden, der dies findet, verweist @fd0 auf [dieses Dokument] (https://developer.apple.com/library/mac/technotes/tn2083/_index.html). nickcoxdotme vor 9 Jahren 2

2 Antworten auf die Frage

5
zekel

Der Einstieg in launchctl kann definitiv eine frustrierende Erfahrung sein. Ich habe viele Artikel gefunden, in denen erklärt wird, was Sie tun sollen, aber es gibt nur wenige herunterladbare Beispiele. Hier ist ein einfaches LaunchDaemon, das hoffentlich ein guter Ausgangspunkt ist. Sie können die Dateien einfach hier herunterladen, wenn Sie nicht Lust haben, zu kopieren und einzufügen.

Hinweis: Sie müssen MY_USER_NAME durch Ihren Benutzernamen ersetzen. Die Plist muss Ihr Skript finden.

// at ~/Desktop/testdaemon/com.wintr.eodemail.plist <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.wintr.eodemail</string> <key>Program</key> <string>/Users/MY_USER_NAME/Desktop/testdaemon/testdaemon.sh</string> <key>StandardErrorPath</key> <string>/var/log/eod-email.log</string> <key>StandardOutPath</key> <string>/var/log/eod-email.log</string> <key>RunAtLoad</key> <true/> <key>StartInterval</key> <integer>15</integer> </dict> </plist> 

Dies ist ein einfaches Daemonskript, das die datetime an eine Datei auf Ihrem Desktop anfügt. Hinweis: Da das Skript als root ausgeführt wird, ist Tilde (~) nicht das erwartete Ausgangsverzeichnis.

// at ~/Desktop/testdaemon/testdaemon.sh #!/bin/sh home="/Users/MYUSERNAME" ## note -- this will be run as root, ~ is not your normal user now=$(date "+%Y-%m-%d %H.%M.%S") echo $now >> "$home/Desktop/TestFile.txt" 

Schließlich schreibe ich immer ein kleines Shell-Skript, um die LaunchDaemons zu installieren, da es leicht ist, einen Fehler zu machen. Da launchctl Ihr Skript als root ausführt, müssen die Berechtigungen des Skripts für andere nicht schreibbar sein, da dies im Wesentlichen root-Berechtigungen hat.

// ~/Desktop/testdaemon/install.sh #!/bin/sh -e plist_path="com.wintr.eodemail.plist" plist_filename=$(basename "$plist_path") install_path="/Library/LaunchDaemons/$plist_filename"  echo "installing launchctl plist: $plist_path --> $install_path" sudo cp -f "$plist_path" "$install_path" sudo chown root "$install_path" sudo chmod 644 "$install_path"  sudo launchctl unload "$install_path" sudo launchctl load "$install_path"  echo "to check if it's running, run this command: sudo launchctl list | grep wintr" echo "to uninstall, run this command: sudo launchctl unload \"$install_path\"" 
Vielen Dank! Ich hatte ein anderes Problem, aber durch dieses Beispiel und das Filtern der Protokolle in der Konsole auf "launchd" konnte ich mein Problem als eine der folgenden Berechtigungen identifizieren: Ich stelle sicher, dass plist und script root gehören und nicht von anderen geschrieben werden können , und stellen Sie sicher, dass ich launchctl via sudo ausgeführt habe. Chris Conover vor 8 Jahren 3
-1
Promod

Es wäre hilfreich, wenn Sie die Ausgabe von einfügen könnten launchctl list | grep 'com.wintr.eodemail'.

Überprüfen Sie auch Ihre /var/log/eod-email.logDatei. Möglicherweise erhalten Sie genaue Fehler.

Ich empfehle die Installation von brew cask install launchcontrol, das ein gui-Tool für launchctl ist. Es kann dabei helfen, Fehler zu finden und Fehler zu beheben.