Odpowiedzi:
O Boże! Nie nie nie. Nie używaj kill -9.
Nie daje to procesowi możliwości czystego:
zamknij połączenia gniazd
oczyść pliki tymczasowe
poinformować dzieci, że odchodzi
zresetować charakterystykę terminala itd. itd.
Zasadniczo wyślij 15 i poczekaj sekundę lub dwie, a jeśli to nie zadziała, wyślij 2, a jeśli to nie zadziała, wyślij 1. Jeśli to nie zadziała, USUŃ BINARNOŚĆ, ponieważ program źle się zachowuje!
Nie używaj kill -9. Nie wyjmuj kombajnu tylko po to, by posprzątać doniczkę.
Proces zombie (właściwie teraz się nazywa <defunct>
) nie jest tak naprawdę procesem. Jest to tylko wpis w tabeli procesów, więc proces nadrzędny może wykonać wait()
wywołanie systemowe .
Nie powinieneś się o nich martwić. Nie zajmują żadnych zasobów, znikają, gdy ich rodzic woła, wait()
gdy umiera sam rodzic.
Odpowiedź jest już zaakceptowana: MOŻESZ zabić proces zombie. Dołącz za pomocą debugera do procesu nadrzędnego i wywołaj funkcję waitpid. Np .: - załóżmy, że rodzic ma PID = 100, proces zombie ma PID = 200
$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit
Proces zombie nie ma żadnych przydzielonych zasobów innych niż wpis w drzewie procesów. Dzieje się tak, gdy finalizuje proces, jednak proces nadrzędny jeszcze nie odnieść go (tzn wait
ed na nim).
Możesz spróbować zmusić rodzica do zrobienia tego, jeśli chcesz, wysyłając mu SIGCHLD ( kill -20
) do rodzica, ale nie ma gwarancji, że rodzic to uszanuje.
Często będziesz je widzieć przez krótki czas (na przykład podczas przeglądania drzewa procesów za pomocą góry) - jest to normalne; W odcinku czasu między zakończeniem procesu potomnego a rodzicielem odpytuje o niego - proces potomny pojawi się jako zombie.
Jeśli jednak widzisz procesy zombie, które ciągle istnieją - co nie jest normalne - nadal nie musisz się tym przejmować - ponownie, ponieważ nie ma zasobów przydzielonych do martwego procesu - ogólnie oznacza to, że aplikacja jest źle napisana przez kiepskich programistów.
Jedynym momentem, w którym powinieneś się martwić procesami zombie, jest to, że widzisz ich wiele, na przykład, jeśli ta sama kiepska aplikacja wspomniana powyżej jest obciążona.
Mamy wielu gównianych programistów, w których pracuję, więc mam zaszczyt radzić sobie z takimi problemami i uczyć się wszelkiego rodzaju bezużytecznych rzeczy. W rzeczywistości - mój zespół często ucieka się do korzystania z gównianych skryptów powłoki napisanych przez tych gównianych deweloperów w wywiadach - jeśli kandydat może stwierdzić, że skrypt jest naprawdę kiepski, i powiedzieć nam, dlaczego jest gówniany, ma dobrą stopę w drzwiach.
Co do wirtualnej strzelby ...
$ shoot <pid>
#! / bin / sh ofiara = `ps -e -o pid, ppid | egrep "^ \ s * $ 1 \ b" | awk '{print $ 2}' ' ofiara \ nazwa = `ps -e -o pid, cmd | egrep "^ \ s * $ {ofiara} \ b" | głowa -n 1 | awk '{print $ 2}' ' #kill $ {ofiara} echo „Zabito $ {nazwa_atiary}.”
I pamiętaj: zawsze strzelaj im w głowę.
Proces zombie jest procesem, który zakończył wykonywanie, ale nadal znajduje się na liście w tabeli procesów.
kill -9 [nadrzędna nazwa_procesu] odłoży to, ze skrajnym uprzedzeniem.