←→ Underneath: Background Apps · Všechny návody pro Mac
Proč se aplikace po restartu Macu vrací
Ukončili jste ji. V Monitoru aktivity jste dokonce vynutili její ukončení. O dvě sekundy později nebo po dalším restartu zase běží. Něco ji spouští záměrně. Na Macu je to téměř vždy launchd.
Stručná odpověď: aplikace má úlohu launchd. RunAtLoad ji spouští při každém přihlášení a KeepAlive ji spustí znovu pokaždé, když se zastaví. Ukončení procesu úlohu nezmění. Chcete-li ji zastavit natrvalo, vypněte úlohu, ne proces.
Co je launchd
launchd je první proces, který macOS spustí (ID procesu 1). Spouští téměř všechno ostatní. Čte malé soubory .plist, kterým se říká úlohy (jobs) a které určují, co a kdy spustit. Každá úloha má štítek, jedinečný název jako com.google.keystone.agent.
Aplikace instalují úlohy do ~/Library/LaunchAgents, /Library/LaunchAgents nebo /Library/LaunchDaemons, případně je registrují přímo ze svého balíčku.
Klíče, které aplikaci vracejí
Takhle vypadá typický spouštěcí agent:
<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/>
| Klíč | Účinek | Co vidíte |
|---|---|---|
RunAtLoad | Spustí úlohu hned po načtení, tedy při každém přihlášení (agenti) nebo startu (démoni) | Je tam po každém restartu |
KeepAlive = true | Restartuje proces pokaždé, když skončí | Vynucené ukončení nic nezmění; za pár sekund je zpátky |
KeepAlive s podmínkami | Restartuje jen v některých případech, například po pádu (SuccessfulExit = false) nebo když je dostupná síť | Někdy se vrátí, ale ne vždy |
StartInterval | Spouští každých N sekund | Objeví se, chvíli běží, zmizí a znovu |
StartCalendarInterval | Spouští v nastavených časech, podobně jako cron | Objevuje se každý den ve stejnou dobu |
WatchPaths | Spouští, když se změní soubor nebo složka | Objeví se, když uděláte něco zdánlivě nesouvisejícího |
launchd mezi restarty úlohy, která pořád končí, čeká zhruba 10 sekund, takže úloha s KeepAlive může také vypadat, že „bliká“.
Další důvody, proč se aplikace vrací
- Otevřít po přihlášení. Aplikace je v Nastavení systému › Obecné › Položky otevírané po přihlášení a rozšíření. macOS ji otevře při každém přihlášení.
- Po opětovném přihlášení znovu otevřít okna. Toto zaškrtávací políčko v dialogu restartu a vypnutí obnoví každou aplikaci, která byla otevřená.
- Aplikace se přidá zpět sama. Její vlastní nastavení „Spouštět po přihlášení“ ji při každém spuštění znovu zaregistruje.
- Pomocný proces otevře hlavní aplikaci. Nejdřív se spustí malý pomocný proces na pozadí a ten pak otevře celou aplikaci, například aby ukázal stav synchronizace.
- Služby Homebrew.
brew services startzapíše spouštěcího agenta sRunAtLoad. Zastavíte ho příkazembrew services stop <name>.
Zjistěte, o co jde
- Najděte štítek úlohy. Spusťte
launchctl list | grep -i examples částí názvu aplikace nebo vývojáře. Třetí sloupec je štítek. - Přečtěte si úlohu:
Hledejtelaunchctl print gui/$(id -u)/com.example.helperpath(soubor plist),state,runs(kolikrát se spustila) alast exit code. Vysoký počet spuštění obvykle znamenáKeepAlive. - Otevřete plist a zkontrolujte
RunAtLoad,KeepAlivea klíče intervalů. - Pokud žádná úloha není, zkontrolujte Otevřít po přihlášení a vlastní nastavení aplikace.
Zastavit vs. vypnout
| Co uděláte | Vrátí se? |
|---|---|
| Ukončíte proces nebo vynutíte jeho ukončení | Ano: hned, pokud má KeepAlive, po dalším přihlášení, pokud má RunAtLoad |
launchctl bootout gui/$(id -u)/label | Teď ne. Po dalším přihlášení ano, pokud má RunAtLoad |
launchctl disable gui/$(id -u)/label + bootout | Ne, dokud nespustíte launchctl enable |
| Přesunete plist mimo LaunchAgents + bootout | Ne, dokud ho nevrátíte zpět |
| Vypnete v Povolit na pozadí | Ne, dokud to znovu nezapnete |
Příkazy krok za krokem najdete v návodu jak bezpečně vypnout spouštěcí agenty.
FAQ
Proč se proces znovu spustí hned poté, co ho ukončím v Monitoru aktivity?
Jeho úloha launchd má nastavené KeepAlive. launchd proces hlídá a po jeho ukončení ho znovu spustí. Místo ukončení procesu zastavte úlohu příkazem launchctl bootout.
Co znamená RunAtLoad?
RunAtLoad je klíč v souboru plist launchd. Když má hodnotu true, launchd spustí úlohu hned po načtení plistu, což u spouštěcího agenta znamená při každém přihlášení.
Co znamená KeepAlive?
KeepAlive říká launchd, aby udržoval úlohu v běhu. Když se proces ukončí nebo je zabit, launchd ho spustí znovu. Může to být i sada podmínek, třeba restart jen po pádu.
Jaký je rozdíl mezi zastavením a vypnutím spouštěcího agenta?
Zastavení (launchctl bootout) uvolní úlohu do příštího přihlášení nebo restartu. Vypnutí (launchctl disable nebo přesunutí plistu mimo LaunchAgents) zabrání tomu, aby se po restartu znovu načetla.