←→ 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/>
| Klucz | Działanie | Co widzisz |
|---|---|---|
RunAtLoad | Uruchamia zadanie zaraz po załadowaniu, czyli przy każdym logowaniu (agenty) lub starcie (demony) | Jest tam po każdym ponownym uruchomieniu |
KeepAlive = true | Uruchamia proces ponownie za każdym razem, gdy się zakończy | Wymuszenie końca nic nie daje; po kilku sekundach znowu działa |
KeepAlive z warunkami | Uruchamia ponownie tylko w niektórych przypadkach, np. po awarii (SuccessfulExit = false) albo gdy sieć jest dostępna | Wraca czasem, nie zawsze |
StartInterval | Uruchamia co N sekund | Pojawia się, chwilę działa, znika i tak w kółko |
StartCalendarInterval | Uruchamia o ustalonych porach, jak cron | Pojawia się codziennie o tej samej porze |
WatchPaths | Uruchamia, gdy zmieni się plik lub folder | Pojawia 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
- Otwieraj podczas logowania. Aplikacja jest w Ustawieniach systemowych › Ogólne › Rzeczy otwierane podczas logowania i rozszerzenia. macOS otwiera ją przy każdym logowaniu.
- Otwórz ponownie okna po ponownym zalogowaniu. To pole w oknie ponownego uruchamiania i wyłączania przywraca każdą aplikację, która była otwarta.
- Aplikacja sama się dodaje z powrotem. Jej własne ustawienie „Uruchamiaj podczas logowania” rejestruje ją ponownie przy każdym uruchomieniu.
- Proces pomocniczy otwiera główną aplikację. Najpierw startuje mały proces w tle, a potem otwiera pełną aplikację, na przykład aby pokazać stan synchronizacji.
- Usługi Homebrew.
brew services startzapisuje agenta uruchamiania zRunAtLoad. Zatrzymaj go poleceniembrew services stop <name>.
Sprawdź, co to jest
- Znajdź etykietę zadania. Wykonaj
launchctl list | grep -i example, wpisując część nazwy aplikacji lub dewelopera. Trzecia kolumna to etykieta. - Odczytaj zadanie:
Szukajlaunchctl print gui/$(id -u)/com.example.helperpath(plik plist),state,runs(ile razy się uruchomiło) ilast exit code. Duża liczba uruchomień zwykle oznaczaKeepAlive. - Otwórz plik plist i sprawdź
RunAtLoad,KeepAliveoraz klucze interwałów. - Jeśli zadania nie ma, sprawdź Otwieraj podczas logowania i własne ustawienia aplikacji.
Zatrzymanie a wyłączenie
| Co robisz | Wróci? |
|---|---|
| Kończysz proces lub wymuszasz jego koniec | Tak: od razu, jeśli ma KeepAlive, przy następnym logowaniu, jeśli ma RunAtLoad |
launchctl bootout gui/$(id -u)/label | Nie teraz. Tak przy następnym logowaniu, jeśli ma RunAtLoad |
launchctl disable gui/$(id -u)/label + bootout | Nie, dopóki nie wykonasz launchctl enable |
| Przenosisz plik plist poza LaunchAgents + bootout | Nie, dopóki go nie przeniesiesz z powrotem |
| Wyłączasz w Pozwalaj w tle | Nie, 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.