Czy istnieje coś silniejszego niż „Force Quit”?

24

Mam aplikację, która nie umrze: zniknęła ze stacji dokującej, ale okno pozostało (z piłką plażową, jeśli na niego kliknę). Nie używa procesora, ale chcę, żeby zniknął.

Czy istnieje coś silniejszego niż „Force Quit”, aby naprawdę zabić aplikację?

Rozpoznać
źródło
Nie jestem pewien, czy jest silniejszy, ale spróbuj Aplikacje> Narzędzia> Monitor aktywności. Znajdź proces i wymuś zamknięcie. Jeśli to nie zadziała, zanotuj numer procesu, przejdź do Terminala i wpisz „kill #”, gdzie # to numer procesu. HTH
David DelMonte
6
przycisk zasilania?
Daniel
1
@DanielLawson Niestety, takie sytuacje zwykle powodują.
CajunLuke,
1
David: Zakładam, że to, co Apple nazywa „Force Quit”, jest takie samo bez względu na to, jak do tego dojdziesz, ale ja też tego spróbowałem, bez żadnego efektu.
Ken

Odpowiedzi:

14

Jeśli znasz nazwę aplikacji, możesz sprawdzić w Monitorze aktywności, czy nadal tam działa i wypróbować jej wymuszenie. Jeśli to nie zadziała, zanotuj identyfikator procesu aplikacji (pid). Idź do terminala i wpisz kill [pid], zastępując „[pid]” numerem, który zanotowałeś wcześniej. Jeśli to nie zadziała, spróbuj, kill -3 [pid]a jeśli to nie zadziała kill -9 [pid]. Jeśli proces jest własnością innego użytkownika (jest to mało prawdopodobne), może być konieczne zastąpienie killgo sudo killi wpisanie hasła po wyświetleniu monitu.

Jeśli aplikacja nie wyświetla się w Monitorze aktywności lub nie możesz tego killzrobić, okno może pozostać w innym miejscu i aplikacja po prostu nie działa. W takim przypadku czasami (nie zawsze) może działać do killall SystemUIServerlub killall Dock.

Jeśli to nie zadziała, musisz się wylogować, ponownie zalogować lub uruchomić ponownie. Kilka razy, kiedy dotarłem do tego momentu, aplikacja była tak zablokowana, że ​​uniemożliwiała wylogowanie lub wyłączenie, więc musiałem mocno zrestartować komputer.

CajunLuke
źródło
Próbowałem tych wszystkich (w tym sudo, mimo że proces jest własnością mnie), bez zmian. Wpłynie killall SystemUIServerna inne otwarte aplikacje, takie jak zapominanie pozycji okien?
Ken
2
gentmatt: Według kill -l-3 to SIGQUIT, a -9 to SIGKILL („nie do złapania, nie do zapomnienia”).
Ken
1
@gentmatt 3 to sygnał QUIT, który umożliwia procesowi przechwycenie sygnału i przeprowadzenie czyszczenia. 9 is KILL jest „nie do złapania i nie do zapomnienia”. Istnieje wiele innych sygnałów, które możesz wysłać; uruchom man kill(który znajduje się w pierwszej 10 najlepszych komend UNIX-a), aby zobaczyć je wszystkie.
CajunLuke,
1
Zwykle po prostu zabijam -9. -3 nie jest silniejszy niż „Force Quit”
segfault
3
@BoTian True; Pomijam od razu do -9. Czasami wcale nie przejmuję się Force Quit. Ale dla użytkownika, który nie wie, co robi, może działać i jest mniej prawdopodobne, że będzie szkodliwy. To również nie trwa bardzo długo, więc czas spędzony na oczekiwanym wyniku nie jest wcale taki zły.
CajunLuke,
7

Okno wymuszonego wyjścia killalli killwszystkie wysyłają domyślnie przetwarza sygnały TERM. Możesz użyć, killall -killjeśli to nie działa.

Narzędzie killall zabija procesy wybrane według nazwy, w przeciwieństwie do wyboru przez pid, jak to zrobiono przez kill (1). Domyślnie wyśle ​​sygnał TERM do wszystkich procesów o prawdziwym UID identycznym z wywołującym killall, które pasują do nazwy procname. Superużytkownik może zabić dowolny proces.

Jeśli uruchomisz sudo dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }'i zamkniesz aplikację z okna wymuszonego zakończenia, sygnał jest zwykle pokazywany jako -15 (TERM). Ale po zamknięciu procesu w tle (lub aplikacji, która nie jest wyświetlana w Docku) z Monitora aktywności, sygnał jest zwykle wyświetlany jako -9 (ZABIJ).

SIGTERM to domyślny sygnał wysyłany do procesu za pomocą komend kill lub killall. Powoduje zakończenie procesu, ale w przeciwieństwie do sygnału SIGKILL, proces może go wychwycić i zinterpretować (lub zignorować). Dlatego SIGTERM przypomina prośbę o dobre zakończenie procesu, umożliwiając czyszczenie i zamykanie plików. Z tego powodu, na wielu systemach uniksowych podczas zamykania, init wydaje SIGTERM wszystkim procesom, które nie są niezbędne do wyłączenia zasilania, odczekuje kilka sekund, a następnie wydaje SIGKILL przymusowe zakończenie takich procesów.

Lri
źródło
Kilka dobrych informacji tutaj, ale żaden z tych wariantów zabijania procesu nie wydaje się mieć na to żadnego wpływu.
Ken
Jeśli nawet nie SIGKILLdziała, aplikacja jest prawdopodobnie w nieprzerwanym trybie uśpienia i naprawdę nic nie możesz zrobić (poza ponownym uruchomieniem).
Blacklight Shining
Zastanawiam się też, czy była to aplikacja użytkownika, taka jak mail.app lub pages.app, czy też był to proces systemowy, taki jak Spotlight, lub proces działający w tle aplikacji, taki jak Plex (który mam problemy z usunięciem).
David DelMonte,
6

Miałem sytuacje, w których Force Quit, Monitor aktywności killi inne metody nie działały, a mój Mac nie mógł się z tego powodu wyłączyć.

W tym przypadku sudo shutdown -r nowzadziałało, gdy nic innego by nie działało, i jest prawdopodobnie lepsze niż wykonanie twardego wyłączenia za pomocą przycisku zasilania.

Dziecko karate
źródło
1

Jak w powyższych odpowiedziach, najsilniejszym sposobem na zakończenie dowolnego procesu jest SIGKILLnp kill -9 process_id.

Jednak istnieją procesy, jakie są po prostu niemożliwe, aby Force Quitnie kill. Nazywali je zombieprocesami.

Oto krótki skrypt, który utworzy zombieproces na dwie minuty:

perl -e 'if($p=fork) {print "unkillable pid:$p\n" ;system("ps -l"); sleep(120)}'

Uruchom powyższy skrypt w terminalu, a otrzymasz dane wyjściowe, takie jak:

     unkillable pid:50571
        UID   PID  PPID        F CPU PRI NI       SZ    RSS WCHAN     S             ADDR TTY           TIME CMD
        501 47380 47379     4006   0  31  0  2448416   2900 -      S                   0 ttys000    0:00.36 -bash
        501 50570 47380     4006   0  31  0  2443512   1424 -      S+                  0 ttys000    0:00.01 perl -e if($p=fork) {print "u
#THIS-> 501 50571 50570     2006   0   0  0        0      0 -      Z+                  0 ttys000    0:00.00 (perl)
        501 12795 12794     4006   0  31  0  2448296   1752 -      S+                  0 ttys001    0:00.75 -bash
        501 50123 50122     4006   0  31  0  2448296   2688 -      S+                  0 ttys002    0:00.14 -bash

Jeśli sprawdzisz kolumnę statusu dla niemożliwego do zabicia procesu (w tym przypadku: 50571), zobaczysz Zflagę, co oznacza zombie.

Możesz spróbować wysłać dowolny killsygnał (np. kill -9 50571), A proces będzie nadal istniał. W każdym razie nie szkodzi to bardzo systemowi, ponieważ tak naprawdę nie istnieje - zajmuje tylko tabelę procesów.

W powyższym przykładzie za 120 sekund zostanie wyczyszczone.

jm666
źródło
0

Oto co powinieneś zrobić:

  1. W Monitorze aktywności kliknij dwukrotnie proces LUB kliknij ikonę Informacje, aby otworzyć okno procesu.
  2. Zobaczysz nr procesu w wierszu Grupa procesów jako nazwaProcesu (####), gdzie „####” to numer Twojego procesu.
  3. Otwórz terminal i wpisz „sudo kill ####” bez cudzysłowów i naciśnij klawisz Enter
  4. Wprowadź swoje hasło, terminal nie pokaże tutaj twojego wpisu
  5. Proces został zabity.

Taki proces najlepiej usunąć w trybie awaryjnym, jeśli zamierzasz odinstalować.

Na zdrowie, Bryan

Brock Vond
źródło