←→ 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üssel | Wirkung | Was Sie sehen |
|---|---|---|
RunAtLoad | Startet den Job, sobald er geladen wird, also bei jeder Anmeldung (Agents) oder jedem Systemstart (Daemons) | Er ist nach jedem Neustart da |
KeepAlive = true | Startet den Prozess jedes Mal neu, wenn er endet | Sofort beenden bringt nichts; er ist in Sekunden zurück |
KeepAlive mit Bedingungen | Startet nur in bestimmten Fällen neu, etwa nach einem Absturz (SuccessfulExit = false) oder solange das Netzwerk verfügbar ist | Er kommt manchmal zurück, nicht immer |
StartInterval | Läuft alle N Sekunden | Er erscheint, läuft kurz, verschwindet, wiederholt sich |
StartCalendarInterval | Läuft zu festen Zeiten, wie cron | Er erscheint jeden Tag zur selben Zeit |
WatchPaths | Läuft, wenn sich eine Datei oder ein Ordner ändert | Er 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
- Beim Anmelden öffnen. Die App steht unter Systemeinstellungen › Allgemein › Anmeldeobjekte & Erweiterungen. macOS öffnet sie bei jeder Anmeldung.
- Beim nächsten Anmelden alle Fenster wieder öffnen. Dieses Kästchen im Dialog für Neustart und Ausschalten stellt jede App wieder her, die geöffnet war.
- Die App trägt sich selbst wieder ein. Ihre eigene Einstellung „Beim Anmelden starten“ registriert sie bei jedem Start erneut.
- Ein Hilfsprozess öffnet die Haupt-App. Ein kleiner Hintergrund-Hilfsprozess startet zuerst und öffnet dann die vollständige App, etwa um einen Sync-Status anzuzeigen.
- Homebrew-Dienste.
brew services startschreibt einen Launch Agent mitRunAtLoad. Stoppen Sie ihn mitbrew services stop <name>.
Herausfinden, was es ist
- Ermitteln Sie das Label des Jobs. Führen Sie
launchctl list | grep -i exampleaus, mit einem Teil des App- oder Entwicklernamens. Die dritte Spalte ist das Label. - Lesen Sie den Job:
Achten Sie auflaunchctl print gui/$(id -u)/com.example.helperpath(die plist-Datei),state,runs(wie oft er gestartet wurde) undlast exit code. Eine hohe Zahl bei runs deutet meist aufKeepAlivehin. - Öffnen Sie die plist und prüfen Sie
RunAtLoad,KeepAliveund die Intervall-Schlüssel. - Gibt es keinen Job, prüfen Sie „Beim Anmelden öffnen“ und die Einstellungen der App selbst.
Stoppen oder deaktivieren
| Was Sie tun | Kommt es zurück? |
|---|---|
| Den Prozess beenden oder sofort beenden | Ja: sofort bei KeepAlive, bei der nächsten Anmeldung bei RunAtLoad |
launchctl bootout gui/$(id -u)/label | Nicht sofort. Bei RunAtLoad ja, bei der nächsten Anmeldung |
launchctl disable gui/$(id -u)/label + bootout | Nein, bis Sie launchctl enable ausführen |
| Die plist aus LaunchAgents verschieben + bootout | Nein, bis Sie sie zurückverschieben |
| In „Im Hintergrund erlauben“ ausschalten | Nein, 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.