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ę?
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ę?
Odpowiedzi:
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 kill
go sudo kill
i wpisanie hasła po wyświetleniu monitu.
Jeśli aplikacja nie wyświetla się w Monitorze aktywności lub nie możesz tego kill
zrobić, 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 SystemUIServer
lub 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.
sudo
, mimo że proces jest własnością mnie), bez zmian. Wpłynie killall SystemUIServer
na inne otwarte aplikacje, takie jak zapominanie pozycji okien?
kill -l
-3 to SIGQUIT, a -9 to SIGKILL („nie do złapania, nie do zapomnienia”).
man kill
(który znajduje się w pierwszej 10 najlepszych komend UNIX-a), aby zobaczyć je wszystkie.
Okno wymuszonego wyjścia killall
i kill
wszystkie wysyłają domyślnie przetwarza sygnały TERM. Możesz użyć, killall -kill
jeś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.
SIGKILL
działa, aplikacja jest prawdopodobnie w nieprzerwanym trybie uśpienia i naprawdę nic nie możesz zrobić (poza ponownym uruchomieniem).
Miałem sytuacje, w których Force Quit, Monitor aktywności kill
i 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 now
zadziałało, gdy nic innego by nie działało, i jest prawdopodobnie lepsze niż wykonanie twardego wyłączenia za pomocą przycisku zasilania.
Jak w powyższych odpowiedziach, najsilniejszym sposobem na zakończenie dowolnego procesu jest SIGKILL
np kill -9 process_id
.
Jednak istnieją procesy, jakie są po prostu niemożliwe, aby Force Quit
nie kill
. Nazywali je zombie
procesami.
Oto krótki skrypt, który utworzy zombie
proces 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 Z
flagę, co oznacza zombie
.
Możesz spróbować wysłać dowolny kill
sygnał (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.
Oto co powinieneś zrobić:
Taki proces najlepiej usunąć w trybie awaryjnym, jeśli zamierzasz odinstalować.
Na zdrowie, Bryan