So finden Sie heraus, welcher Launch Agent oder Daemon einen Prozess startet

Nach der Installation von Autodesk Smoke laufen zwei httpd-Prozesse ständig und ich möchte sie stoppen. Wenn ich benutze sudo killall httpd, stoppen sie und werden sofort neu gestartet. Activity Monitor zeigt, dass der übergeordnete Prozess gestartet wird, aber wie kann ich feststellen, welcher Agent oder Daemon ihn startet, damit ich ihn deaktivieren kann?

launchctl list | grep httpdzeigt diese Ergebnisse:

302 -   0x7f94ea700dd0.anonymous.httpd  
92  -   org.apache.httpd

Ich schaue hinein /System/Library/LaunchDaemons/org.apache.httpd.plistund es zeigt folgendes. Sie können sehen, dass es auf eingestellt ist disabled. Das andere launchdElement mit einem seltsamen Namen wird bei einer Dateisystemsuche nicht angezeigt, daher habe ich keine Ahnung, was es ist.

<?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>Disabled</key>
    <true/>
    <key>Label</key>
    <string>org.apache.httpd</string>
    <key>EnvironmentVariables</key>
    <dict>
        <key>XPC_SERVICES_UNAVAILABLE</key>
        <string>1</string>
    </dict>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/sbin/httpd</string>
        <string>-D</string>
        <string>FOREGROUND</string>
    </array>
    <key>OnDemand</key>
    <false/>
</dict>
</plist>
Ich habe von Autodesk erfahren, dass ich den Prozess mit stoppen kann, /usr/sbin/apachectl stopaber ich weiß immer noch nicht, wie ich ihn nach jedem Neustart deaktivieren kann.
(Später Kommentar, ich weiß!) Zwei mögliche Gründe, um launchd daran zu hindern, es erneut zu starten: (i) launchctl unload(obwohl ich nicht weiß, ob Sie dazu den Pfad zur plist angeben müssen), (ii) wenn es in Ihren Login-Objekten enthalten ist , verwenden Sie das Systemeinstellungen-Tool --> "Benutzer und Gruppen" --> "Anmeldeobjekte" --> Anstößigen Eintrag löschen, falls gefunden.

Antworten (4)

Sie können die Ausgabe von launchctl listfür die PID abrufen:

$ pgrep -fl foo
40679 bash /tmp/foo
$ launchctl list|grep 40679
40679   -   com.example.foo

Suchen Sie dann beispielsweise nach einer Datei mit dem Namen com.example.foo.plist, ~/Library/LaunchAgents/, /Library/LaunchAgents/oder /Library/LaunchDaemons/.

Bearbeiten: Der Disabled-Schlüssel kann in überschrieben werden /var/db/launchd.db/com.apple.launchd/overrides.plist, was geändert wird, wenn launchctl load -wes als root ausgeführt wird, oder in /var/db/launchd.db/com.apple.launchd.peruser.$UID/overrides.plist, das geändert wird, wenn launchctl load -wes als Benutzer ausgeführt wird.

Wenn die mit OS X gelieferte Apache-Liste aktiviert war, können Sie sie deaktivieren, indem Sie sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist.

Ich habe die PID bekommen, dann launchctl grepped, aber nichts mit dieser Nummer gefunden.
Versuchen Sie es tatsächlich mit sudo launchctl list. launchctl listscheint nur Jobs einzuschließen, die vom Benutzer-launchd-Prozess geladen wurden.
Ok das macht Sinn, danke. Aber das Problem wurde nicht wirklich gelöst ... Ich habe der Frage weitere Details hinzugefügt.

Basierend auf dem Label-Wert (z. B. org.apache.httpd) können Sie versuchen, das .plistmit dem folgenden Befehl zu finden:

find /System/Library/Launch* /Library/Launch* ~/Library/Launch* -name '*.plist' -print -exec /usr/libexec/PlistBuddy -c "Print Label" {} ';' | grep org.apache.httpd -A1

Um herauszufinden, was den Prozess gestartet hat, überprüfen Sie die übergeordneten PIDs, z

ps -f $(launchctl list | grep org.apache.httpd | grep -o '^[0-9]\+')

Oder verwenden Sie den pstreeBefehl, indem Sie die PID manuell angeben, z

pstree 92
pstreefunktioniert ziemlich gut!

Dadurch erhalten Sie eine Liste aller Job-Definitionen, die sich auf beziehen httpd.

grep -lR httpd /System/Library/Launch*/ /Library/Launch*/ ~/Library/LaunchAgents/
Gute Idee, hat aber das Problem nicht gelöst. Es gibt nur ein Ergebnis, und es ist deaktiviert. Ich habe der Frage weitere Details hinzugefügt.
Nur weil es deaktiviert ist, heißt das nicht, dass es nicht gestartet wurde. Der DisabledSchlüssel kann durch die overrides.plistDateien in/unter überschrieben werden /var/db/launchd.db/. Auch ein deaktivierter Job kann weiterhin manuell (nicht automatisch während des Boot-/Anmeldevorgangs) gestartet werden.
Danke, das wusste ich nicht. Ich habe versucht grep -rn apache /private/var/db/launchd.dbund nur ein Ergebnis gefunden. Es ist deaktiviert. Ich muss herausfinden, wie dieser Dienst gestartet wird und wie ich ihn wirklich deaktivieren kann.

Das Verhalten von launchctl hat sich dahingehend geändert, dass ein Dienst, der zwangsweise aktiviert wird, nicht den Inhalt der Quell-.plist ändert, sondern ein separates Verzeichnis (das Sie nicht ändern sollten). Überprüfen Sie die Manpage für launchctl und die Option „-w“ unter dem Befehl „load“. Wenn Sie also einfach die Datei untersuchen, erfahren Sie nicht, ob sie deaktiviert ist oder nicht. Offensichtlich ist es nicht deaktiviert :)

Versuchen Sie "launchctl unload -w org.apache.httpd.plist". Wenn das für Sie funktioniert, können Sie es immer noch bei Bedarf mit "launchctl start org.apache.httpd.plist" starten.

Wenn das nicht funktioniert, versuchen Sie "launchctl remove org.apache.httpd.plist", was Sie nicht manuell starten lässt.