←→ Underneath: Background Apps · Alle Mac-Anleitungen

Warum eine App nach dem Neustart Ihres Mac wiederkommt

Sie haben sie beendet. Sie haben sie in der Aktivitätsanzeige sogar sofort beendet. Zwei Sekunden später oder nach dem nächsten Neustart läuft sie wieder. Irgendetwas startet sie absichtlich. Auf dem Mac ist dieses Etwas fast immer launchd.

Kurz gesagt: Die App hat einen launchd-Job. RunAtLoad startet ihn bei jeder Anmeldung, und KeepAlive startet ihn jedes Mal neu, wenn er endet. Das Beenden des Prozesses ändert nichts am Job. Um ihn dauerhaft zu stoppen, deaktivieren Sie den Job, nicht den Prozess.

Was launchd ist

launchd ist der erste Prozess, den macOS startet (Prozess-ID 1). Er startet fast alles andere. Er liest kleine .plist-Dateien, sogenannte Jobs, die festlegen, was wann ausgeführt wird. Jeder Job hat ein Label, einen eindeutigen Namen wie com.google.keystone.agent.

Apps installieren Jobs in ~/Library/LaunchAgents, /Library/LaunchAgents oder /Library/LaunchDaemons oder registrieren sie aus ihrem eigenen App-Bundle heraus.

Die Schlüssel, die eine App zurückbringen

So sieht ein typischer Launch Agent aus:

<key>Label</key>
<string>com.example.helper</string>
<key>ProgramArguments</key>
<array>
  <string>/Applications/Example.app/Contents/MacOS/Helper</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
SchlüsselWirkungWas Sie sehen
RunAtLoadStartet den Job, sobald er geladen wird, also bei jeder Anmeldung (Agents) oder jedem Systemstart (Daemons)Er ist nach jedem Neustart da
KeepAlive = trueStartet den Prozess jedes Mal neu, wenn er endetSofort beenden bringt nichts; er ist in Sekunden zurück
KeepAlive mit BedingungenStartet nur in bestimmten Fällen neu, etwa nach einem Absturz (SuccessfulExit = false) oder solange das Netzwerk verfügbar istEr kommt manchmal zurück, nicht immer
StartIntervalLäuft alle N SekundenEr erscheint, läuft kurz, verschwindet, wiederholt sich
StartCalendarIntervalLäuft zu festen Zeiten, wie cronEr erscheint jeden Tag zur selben Zeit
WatchPathsLäuft, wenn sich eine Datei oder ein Ordner ändertEr erscheint, nachdem Sie etwas scheinbar Unabhängiges getan haben

launchd wartet etwa 10 Sekunden zwischen Neustarts eines Jobs, der immer wieder endet. Ein KeepAlive-Job kann daher auch zu „flackern“ scheinen.

Weitere Gründe, warum eine App wiederkommt

Herausfinden, was es ist

  1. Ermitteln Sie das Label des Jobs. Führen Sie launchctl list | grep -i example aus, mit einem Teil des App- oder Entwicklernamens. Die dritte Spalte ist das Label.
  2. Lesen Sie den Job:
    launchctl print gui/$(id -u)/com.example.helper
    Achten Sie auf path (die plist-Datei), state, runs (wie oft er gestartet wurde) und last exit code. Eine hohe Zahl bei runs deutet meist auf KeepAlive hin.
  3. Öffnen Sie die plist und prüfen Sie RunAtLoad, KeepAlive und die Intervall-Schlüssel.
  4. Gibt es keinen Job, prüfen Sie „Beim Anmelden öffnen“ und die Einstellungen der App selbst.

Stoppen oder deaktivieren

Was Sie tunKommt es zurück?
Den Prozess beenden oder sofort beendenJa: sofort bei KeepAlive, bei der nächsten Anmeldung bei RunAtLoad
launchctl bootout gui/$(id -u)/labelNicht sofort. Bei RunAtLoad ja, bei der nächsten Anmeldung
launchctl disable gui/$(id -u)/label + bootoutNein, bis Sie launchctl enable ausführen
Die plist aus LaunchAgents verschieben + bootoutNein, bis Sie sie zurückverschieben
In „Im Hintergrund erlauben“ ausschaltenNein, bis Sie es wieder einschalten

Die Befehle Schritt für Schritt finden Sie in So deaktivieren Sie Launch Agents gefahrlos.

FAQ

Warum startet ein Prozess sofort neu, nachdem ich ihn in der Aktivitätsanzeige beendet habe?

Bei seinem launchd-Job ist KeepAlive gesetzt. launchd überwacht den Prozess und startet ihn neu, sobald er endet. Stoppen Sie den Job mit launchctl bootout, statt den Prozess zu beenden.

Was bedeutet RunAtLoad?

RunAtLoad ist ein Schlüssel in einer launchd-plist. Ist er auf true gesetzt, startet launchd den Job, sobald es die plist lädt – bei einem Launch Agent also bei jeder Anmeldung.

Was bedeutet KeepAlive?

KeepAlive weist launchd an, den Job am Laufen zu halten. Endet der Prozess oder wird er abgebrochen, startet launchd ihn erneut. Es kann auch eine Reihe von Bedingungen sein, etwa nur nach einem Absturz neu starten.

Was ist der Unterschied zwischen Stoppen und Deaktivieren eines Launch Agents?

Stoppen (launchctl bootout) entlädt den Job bis zur nächsten Anmeldung oder zum nächsten Neustart. Deaktivieren (launchctl disable oder die plist aus LaunchAgents verschieben) verhindert, dass er nach einem Neustart wieder geladen wird.