it-swarm.com.de

Daemon kann nicht mit launchctl in Yosemite gestartet werden

Ich habe einen launchd-Daemon in ~/Library/LaunchAgents, der in Mavericks gut funktioniert hat. In der öffentlichen Betaversion von Yosemite wird es jedoch nicht gestartet. Die Daemon-Liste sieht so aus (mein Benutzername ist darksair mit UID 501)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.Apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>LaunchOnlyOnce</key>
    <false/>
    <key>UserName</key>
    <string>darksair</string>
    <key>ProcessType</key>
    <string>Standard</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

Grundsätzlich sollte ~/bin/retrmail.py alle 5 Minuten ausgeführt werden.

Ich stelle fest, dass in Yosemite launchd auf 2.0 aktualisiert wird und launchctl neue Befehle hat. Ich habe es versucht

Sudo launchctl kickstart user/501/org.darksair.retrmail

und es hieß

Could not find service "org.darksair.retrmail" in domain for uid: 501

Ich habe auch die alte Schule ausprobiert

Sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

und es hieß

/Users/darksair/Library/LaunchAgents/retrmail.plist: Path had bad ownership/permissions

Die Datei gehört mir und der Personalgruppe. Ich habe beide Rechte 644 und 600 mit dem gleichen Fehler ausprobiert.

Weiß jemand, wie man einen launchd-Daemon in Yosemite richtig startet?


UPDATE: Meine Start-Agent-Datei muss anscheinend im Besitz von root:wheel sein. Nachdem ich geklaut hatte, versuchte ich es

Sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

und es wurde kein Fehler ausgegeben. Und ich denke , dass mein Deamon richtig läuft. Ich lasse diese Frage offen, da ich mich erinnere, dass im launchd-Dokument eindeutig angegeben ist, dass der Benutzer, der den Dämon ausführt, Eigentümer der Datei des Startagenten sein kann.


UPDATE2: Nein, es lief nicht richtig. Es wurde nur einmal ausgeführt, aber nicht erneut, als wäre es entladen worden.


UPDATE3: Ich habe ein Upgrade auf die öffentliche Beta 3 von Yosemite durchgeführt und meinen Agenten darauf umgestellt

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.Apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>UserName</key>
    <string>darksair</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

Ich habe diesen Agenten neu geladen und denke, dass er jetzt richtig funktioniert. Ich lasse diese Frage immer noch offen, da ich nicht weiß, was mit meiner vorherigen Liste nicht stimmt.


Abschließend habe ich festgestellt, dass ich den Besitzer der Liste in root:wheel ändern muss, um sie zu laden.

27
MetroWind

Die Lösung gefunden.

Der richtige Befehl ist in diesem Fall

launchctl bootstrap gui/501 ~/Library/LaunchAgents/retrmail.plist

Und zu entladen,

launchctl bootout gui/501 ~/Library/LaunchAgents/retrmail.plist

Ich weiß nicht, warum launchctl load root erfordert, aber das Laden/Entladen ist sowieso veraltet.

4
MetroWind

Von man launchctl

Beachten Sie, dass die benutzerspezifischen Konfigurationsdateien (LaunchAgents) Eigentum von root sein müssen (wenn sie sich in/Library/LaunchAgents befinden) oder vom Benutzer geladen werden müssen (wenn sie sich in $ HOME/Library/LaunchAgents befinden). Alle systemweiten Daemons (LaunchDaemons) müssen Eigentum von root sein. Konfigurationsdateien müssen Gruppen- und Weltschreibvorgänge nicht zulassen. Diese Einschränkungen gelten aus Sicherheitsgründen, da durch das Ermöglichen des Schreibens in eine launchd-Konfigurationsdatei angegeben werden kann, welche ausführbare Datei gestartet wird.

Fix ist

Sudo chmod 600 /Library/LaunchDaemons/x.plist
Sudo chown root /Library/LaunchDaemons/x.plist
21
diimdeep

Seltsamerweise war die Verwendung von Sudo Ihr Problem. Durch die Verwendung von Sudo waren Sie nicht mehr Sie selbst, also nicht der Eigentümer Ihrer eigenen Datei. Entfernen Sie Sudo, wiederholen Sie den Befehl und es sollte gut geladen werden. Entschuldigen Sie die philosophische Herangehensweise an alles.

5
AlexPantea

Bin auch darauf gestoßen und habe versucht, user zu verwenden, nicht root-besessene .plist (wie man es tun sollte)

$ load ~/Library/LaunchAgents/com.blash.blah.plist
Could not find domain for 

Ich war remote auf diesem Computer angemeldet, während ich NICHT an der Konsole (ohne Kopf) angemeldet war. Dies schien mein Problem zu sein. Zumindest für die vom Benutzer verwalteten Dienste muss der Benutzer auf dem Hauptbildschirm angemeldet sein Login über Remote-Management, da es sich um eine Headless-Maschine handelt)

IMO, wenn Sie möchten, dass dies auch dann ausgeführt wird, wenn Sie nicht persönlich vor Ort sind, um sich einzuloggen, haben Sie folgende Optionen:

  • Melden Sie sich automatisch bei Ihrem Konto an (beachten Sie die Auswirkungen auf die Sicherheit, auch ohne das in einer der Antworten angegebene UserName-Tag).

  • Machen Sie die Dateien wie in den verschiedenen Vorschlägen angegeben zu Root-Dateien (setzen Sie den Benutzer mit Benutzername auf Ihren zurück, wie Sie es bereits getan haben).

3
nhed

Entfernen Sie den Schlüssel und die Zeichenfolge UserName.

Das Problem ist, dass der Schlüssel UserName nur verwendet werden kann, wenn der Prozess von root gestartet wird. Es kann nur als root gestartet werden, wenn die plist im Besitz von root ist. Grundsätzlich wird der Prozess von root gestartet und dann dem angegebenen Benutzer zugeordnet. Wenn Sie möchten, dass dieser Prozess als Sie selbst ausgeführt wird, legen Sie die Plist in den Ordner ~/Library/LaunchAgents und entfernen Sie den UserName-Schlüssel.

2

Hier ist eine dumme Idee.

Ich hatte nur den gleichen Fehler, auch nach dem Upgrade auf Yosemite. Ich habe fälschlicherweise angenommen, dass die .plist-Datei fehlerhaft ist, obwohl aus irgendeinem Grund die Binärdatei, auf die ich mich in der Plist beziehe (in meinem Fall Cassandra), ihr ausführbares Bit verloren hat.

chmod + x'ing es repariert es.

Wahrscheinlich nicht dein Problem, aber vielleicht einen Versuch wert :)

Haben Sie versucht, einen Agenten mit Benutzerberechtigungen manuell neu zu laden? Ich verstehe nicht ganz, warum dies erforderlich ist, aber ich glaube, dass Sie an Ihre Benutzerdomäne gebunden sein müssen (an die Sie anscheinend nicht gebunden sind, wenn Sie als Root ausgeführt werden). Das erneute Anschließen dieser Funktionen hat bei mir funktioniert.

function as_user {
    local user="$1"
    local user_pid=$(ps -axj | awk "/^$user / {print \$2;exit}")
    local command="Sudo launchctl bsexec $user_pid Sudo -u '$user' $2"
    echo "Running:"
    echo "$command"
    eval $command
}

function as_current_user {
    as_user "$(whoami)" "$*"
}

function reload_agent {
    as_current_user launchctl unload "$1"
    as_current_user launchctl load "$1"
}

Sie würden dies wie folgt verwenden:

reload_agent ~/Library/LaunchAgents/com.hw.helloworld.plist

Mit bsexec werden Sie wieder in Ihre Domäne aufgenommen und können die Aufgabe als Benutzer-Launchagent hinzufügen.

1
imalison