Daemon kann nicht mit launchctl in Yosemite gestartet werden


27

Ich habe einen launchd-Daemon ~/Library/LaunchAgents, der in Mavericks gut funktioniert. In der öffentlichen Betaversion von Yosemite wird es jedoch nicht gestartet. Die Daemon-Liste sieht so aus (mein Benutzername ist darksairmit der 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 soll es ~/bin/retrmail.pyalle 5 Minuten laufen .

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 Berechtigungen 644 und 600 mit demselben Fehler versucht.

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


UPDATE: Sieht so aus, als müsste meine Launch Agent-Datei im Besitz von sein root:wheel. Nachdem ich chown, versuchte ich es

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

und es gab keinen Fehler aus. Und ich denke, mein Deamon läuft einwandfrei. 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, weil ich nicht weiß, was mit meiner vorherigen Liste nicht stimmt.


Abschließend habe ich festgestellt, dass ich den Besitzer der Pliste ändern root:wheelmuss, um sie zu laden.


Funktioniert das in Yosemite final?
TJ Luoma

@TJLuoma: ja. Solange die Pliste im Besitz von root: wheel ist.
MetroWind

Antworten:


21

Von man launchctl

Beachten Sie, dass sich die benutzerspezifischen Konfigurationsdateien (LaunchAgents) im Besitz von root befinden müssen (wenn sie sich in / Library / LaunchAgents befinden) oder vom Benutzer geladen werden (wenn sie sich in $ HOME / Library / LaunchAgents befinden). Alle systemweiten Daemons (LaunchDaemons) müssen Eigentum von root sein. Konfigurationsdateien müssen Gruppen- und Weltschreibzugriffe 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

2
"Oder der Benutzer lädt sie" <- Dies ist der Teil, mit dem ich ein Problem habe.
MetroWind

2
Ich bin kein Unix-Typ, aber es steht "Disallow Group and World Writes". Da es möglicherweise noch gelesen werden muss, sollte es nicht sein chmod 644?
Jason

5

Seltsamerweise war die Verwendung sudoIhr Problem. Durch die Verwendung von sudowaren Sie nicht länger 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.


4

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 loadroot erforderlich ist, aber das Laden / Entladen ist sowieso veraltet.


Manpage listet Bootout nicht Bootcut. Ich denke, Autokorrektur hat Sie, da es auf meinem Computer Bootout zu Bootcut ändert.
Steve Moser

@MetroWind, das ich erhalte Konnte Domäne für Fehler Code = 112 mit oben genanntem Befehl nicht finden. es ist nicht konsistent. irgendeine Ahnung ?
Parag Bafna

Hast du das chmod& noch gebraucht chown?
Itachi

@ Itachi, nein. Das Verlassen des Standardbesitzers und der Erlaubnis sollte in Ordnung sein.
MetroWind

@ParagBafna, ich bin mir nicht sicher. Vielleicht ist Ihre UID nicht 501?
MetroWind

3

Ich bin auch darauf gestoßen und habe versucht, einen Benutzer zu verwenden, der sich nicht im Besitz von Root befindet .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, als 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 ein Headless-Gerät 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).


2
Ich danke dir sehr. Ich habe in Ihrer Antwort eine Lösung gefunden.
Retraut

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 :)


Dies gilt jedoch nicht für meinen Fall. Meine ausführbare Datei hat das x-Berechtigungsbit. Aber trotzdem danke für die Antwort. Hoffe, es kann einigen anderen Menschen helfen.
MetroWind

2

Entfernen Sie den UserNameSchlüssel und die Schnur.

Das Problem ist, dass der UserNameSchlüssel 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.


Es funktioniert, nachdem ich die Option 'UserName' für zabbix_agend entfernt habe. Vielen Dank! - gist.github.com/chusiang/04db38f5173784e33b68
Chu-Saing Lai

Seltsam… Es wird immer noch nicht geladen, nachdem ich das "UserName" -Ding entfernt habe…
MetroWind

1

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.


Es heißt: /Users/darksair/Library/LaunchAgents/retrmail.plist: Operation wird bereits ausgeführt. Zu diesem Zeitpunkt lauten meine Fragen im Wesentlichen: Warum hat der Kickstart-Befehl nicht funktioniert? Und warum muss ich das Plist-Eigentum auf root setzen ...?
MetroWind

1
Sie sollten den Eigentümer Ihrer plist-Datei NICHT als root festlegen. Alles in ~ / Library / LaunchAgents sollte dem Benutzer gehören, zu dem dieses Verzeichnis gehört. Ich habe den Vorgang bereits ausgeführt, als ich den Befehl nicht entladen habe, bevor ich ihn geladen habe. Verwenden Sie die von mir bereitgestellte Funktion?
Imalison

Ja. Ich habe deine Funktionen benutzt. Und ich habe die Pliste zuerst entladen ...
MetroWind

Ich habe gerade versucht, die erste von Ihnen bereitgestellte Plist zu laden, und es hat bei mir funktioniert. Welche Berechtigungen sind für die Datei festgelegt?
Imalison

Dies ist ein unglaublicher Code für so viele Dinge. Ich verwende eine Mischung aus Marionetten- und benutzerdefinierten Bash-Skripten, um viele verschiedene MacOS-Geräte zu verwalten, und zufällige Probleme, weil die Sicherheitsüberprüfungssitzung oder die Benutzerdomäne nicht korrekt sind, treten häufig auf. Gute Arbeit!
Andrew White
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.