←→ Underneath: Background Apps · Wszystkie poradniki dla Maca

Dlaczego aplikacja wraca po ponownym uruchomieniu Maca

Zakończyłeś ją. Wymusiłeś nawet jej zakończenie w Monitorze aktywności. Dwie sekundy później albo po kolejnym ponownym uruchomieniu znowu działa. Coś celowo ją uruchamia. Na Macu tym czymś jest prawie zawsze launchd.

Krótka odpowiedź: aplikacja ma zadanie launchd. RunAtLoad uruchamia je przy każdym logowaniu, a KeepAlive uruchamia je ponownie za każdym razem, gdy się zatrzyma. Zakończenie procesu nie zmienia zadania. Aby zatrzymać je na dobre, wyłącz zadanie, a nie proces.

Czym jest launchd

launchd to pierwszy proces uruchamiany przez macOS (identyfikator procesu 1). Uruchamia on prawie wszystko inne. Czyta małe pliki .plist, zwane zadaniami (jobs), które mówią, co i kiedy uruchomić. Każde zadanie ma etykietę, czyli unikalną nazwę, np. com.google.keystone.agent.

Aplikacje instalują zadania w ~/Library/LaunchAgents, /Library/LaunchAgents lub /Library/LaunchDaemons albo rejestrują je z wnętrza własnego pakietu aplikacji.

Klucze, które przywracają aplikację

Oto typowy agent uruchamiania:

<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/>
KluczDziałanieCo widzisz
RunAtLoadUruchamia zadanie zaraz po załadowaniu, czyli przy każdym logowaniu (agenty) lub starcie (demony)Jest tam po każdym ponownym uruchomieniu
KeepAlive = trueUruchamia proces ponownie za każdym razem, gdy się zakończyWymuszenie końca nic nie daje; po kilku sekundach znowu działa
KeepAlive z warunkamiUruchamia ponownie tylko w niektórych przypadkach, np. po awarii (SuccessfulExit = false) albo gdy sieć jest dostępnaWraca czasem, nie zawsze
StartIntervalUruchamia co N sekundPojawia się, chwilę działa, znika i tak w kółko
StartCalendarIntervalUruchamia o ustalonych porach, jak cronPojawia się codziennie o tej samej porze
WatchPathsUruchamia, gdy zmieni się plik lub folderPojawia się po tym, jak zrobisz coś pozornie niezwiązanego

launchd odczekuje około 10 sekund między ponownymi uruchomieniami zadania, które ciągle się kończy, więc zadanie z KeepAlive może też wyglądać, jakby „migało”.

Inne powody, dla których aplikacja wraca

Sprawdź, co to jest

  1. Znajdź etykietę zadania. Wykonaj launchctl list | grep -i example, wpisując część nazwy aplikacji lub dewelopera. Trzecia kolumna to etykieta.
  2. Odczytaj zadanie:
    launchctl print gui/$(id -u)/com.example.helper
    Szukaj path (plik plist), state, runs (ile razy się uruchomiło) i last exit code. Duża liczba uruchomień zwykle oznacza KeepAlive.
  3. Otwórz plik plist i sprawdź RunAtLoad, KeepAlive oraz klucze interwałów.
  4. Jeśli zadania nie ma, sprawdź Otwieraj podczas logowania i własne ustawienia aplikacji.

Zatrzymanie a wyłączenie

Co robiszWróci?
Kończysz proces lub wymuszasz jego koniecTak: od razu, jeśli ma KeepAlive, przy następnym logowaniu, jeśli ma RunAtLoad
launchctl bootout gui/$(id -u)/labelNie teraz. Tak przy następnym logowaniu, jeśli ma RunAtLoad
launchctl disable gui/$(id -u)/label + bootoutNie, dopóki nie wykonasz launchctl enable
Przenosisz plik plist poza LaunchAgents + bootoutNie, dopóki go nie przeniesiesz z powrotem
Wyłączasz w Pozwalaj w tleNie, dopóki tego nie włączysz

Polecenia krok po kroku znajdziesz w poradniku jak bezpiecznie wyłączyć agenty uruchamiania.

FAQ

Dlaczego proces uruchamia się ponownie zaraz po tym, jak zakończę go w Monitorze aktywności?

Jego zadanie launchd ma ustawione KeepAlive. launchd pilnuje procesu i uruchamia go ponownie, gdy ten się zakończy. Zatrzymaj zadanie poleceniem launchctl bootout zamiast kończyć proces.

Co oznacza RunAtLoad?

RunAtLoad to klucz w pliku plist launchd. Gdy ma wartość true, launchd uruchamia zadanie zaraz po załadowaniu pliku plist, co w przypadku agenta uruchamiania oznacza przy każdym logowaniu.

Co oznacza KeepAlive?

KeepAlive każe launchd utrzymywać zadanie w działaniu. Jeśli proces się zakończy lub zostanie zabity, launchd uruchamia go ponownie. Może to być też zestaw warunków, na przykład ponowne uruchomienie tylko po awarii.

Czym się różni zatrzymanie od wyłączenia agenta uruchamiania?

Zatrzymanie (launchctl bootout) wyładowuje zadanie do następnego logowania lub ponownego uruchomienia. Wyłączenie (launchctl disable albo przeniesienie pliku plist poza LaunchAgents) sprawia, że po ponownym uruchomieniu zadanie nie zostanie znowu załadowane.