←→ 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íčÚčinekCo vidíte
RunAtLoadSpustí ú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 = trueRestartuje proces pokaždé, když skončíVynucené ukončení nic nezmění; za pár sekund je zpátky
KeepAlive s podmínkamiRestartuje 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
StartIntervalSpouští každých N sekundObjeví se, chvíli běží, zmizí a znovu
StartCalendarIntervalSpouští v nastavených časech, podobně jako cronObjevuje se každý den ve stejnou dobu
WatchPathsSpouští, když se změní soubor nebo složkaObjeví 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í

Zjistěte, o co jde

  1. Najděte štítek úlohy. Spusťte launchctl list | grep -i example s částí názvu aplikace nebo vývojáře. Třetí sloupec je štítek.
  2. Přečtěte si úlohu:
    launchctl print gui/$(id -u)/com.example.helper
    Hledejte path (soubor plist), state, runs (kolikrát se spustila) a last exit code. Vysoký počet spuštění obvykle znamená KeepAlive.
  3. Otevřete plist a zkontrolujte RunAtLoad, KeepAlive a klíče intervalů.
  4. Pokud žádná úloha není, zkontrolujte Otevřít po přihlášení a vlastní nastavení aplikace.

Zastavit vs. vypnout

Co uděláteVrá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)/labelTeď ne. Po dalším přihlášení ano, pokud má RunAtLoad
launchctl disable gui/$(id -u)/label + bootoutNe, dokud nespustíte launchctl enable
Přesunete plist mimo LaunchAgents + bootoutNe, 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.