OS X: LaunchDaemon wird nicht ausgeführt: Dienst konnte nicht initialisiert werden

7

Ich habe Apples scheinbar unkomplizierte Dokumente verwendet , um einen LaunchDaemon zum Ausführen eines von mir geschriebenen Node.js-Skripts zu erstellen.

Hier ist die plistDatei. Es handelt sich im Grunde genommen genau um ein Kopieren und Einfügen aus Apples Dokumenten, 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 hat 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 habe sichergestellt, dass das Skript Node.js ausreichend zulässig ist (777) und über die Befehlszeile ausgeführt werden kann (es ist).
  • Versuchte den absoluten Pfad zur Datei ( /Users/nickcox/projects/eod_email/eod) und stellte sicher, dass ich launchctl unload (daemonname)und lieflaunchctl load (daemon name)

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

Nickcoxdotme
quelle
Die Tilde-Erweiterung wird ab 10.10 nicht mehr funktionieren (zumindest das weiß ich). Verwenden Sie den absoluten Pfad. Ihre Skript-Dauerwellen sollten 755 sein. Und ich denke, dass JavaScriptCore nicht daemon-sicher ist.
fd0
Siehe Kommentar zum absoluten Pfad in "Was ich getan habe". Und es sollte keine Rolle , ob das Skript perms ist allzu freizügig, nicht wahr? Es würde nur nicht funktionieren, wenn es nicht freizügig genug wäre, oder? Aber bis zu Ihrem letzten Punkt, wenn das der Fall ist, habe ich kein Glück?
Nickcoxdotme
Ich empfehle Ihnen, den technischen Hinweis TN2083 zu lesen. Die Dokumentation bleibt hinter dem sich ständig ändernden Start zurück.
fd0
2
Für alle, die dies finden, bezieht sich @ fd0 auf dieses Dokument
nickcoxdotme

Antworten:

5

Der Einstieg in launchctl kann definitiv eine frustrierende Erfahrung sein. Ich habe viele Artikel gefunden, die erklären, was Sie tun sollten, aber nur wenige kleine herunterladbare Beispiele. Hier ist ein einfacher LaunchDaemon, der hoffentlich ein guter Ausgangspunkt sein wird. Sie können die Dateien hier einfach herunterladen, wenn Sie keine Lust zum Kopieren und Einfügen haben.

Hinweis: Sie müssen MY_USER_NAME durch Ihren Benutzernamen ersetzen. Die Liste 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 Daemon-Skript, das die Datums- und Uhrzeitangabe 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 nicht von anderen geschrieben werden können, da dies ihnen im Wesentlichen Root-Berechtigungen einräumen würde.

// ~/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\""
zekel
quelle
3
Vielen Dank! Ich hatte ein anderes Problem, aber durch dieses Beispiel und das Filtern von Protokollen in der Konsole bei "launchd" konnte ich mein Problem als eine der Berechtigungen identifizieren: Ich stelle sicher, dass die Liste und das Skript Eigentum von root sind und nicht von anderen geschrieben werden können und stellen Sie sicher, dass ich launchctl über sudo ausgeführt habe.
Chris Conover
-2

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. Es kann Ihnen genaue Fehler geben.

Ich empfehle, das zu installieren brew cask install launchcontrol, das ein GUI-Tool für Launchctl ist. Es kann helfen, Fehler und Fehlerbehebung zu erkennen.

Pramod
quelle
Ein privatives Programm für Homebrew? Spam.
Abdel Karim Mateos Sanchez