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 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.
sudo, mimo że proces jest własnością mnie), bez zmian. Wpłynie killall SystemUIServerna 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 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.
SIGKILLdział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 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.
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.
Oto co powinieneś zrobić:
Taki proces najlepiej usunąć w trybie awaryjnym, jeśli zamierzasz odinstalować.
Na zdrowie, Bryan