Jak zabić drzewo procesów w systemie Linux? [Zamknięte]

14

Czasami wysłanie SIGTERM do procesu spowoduje wysłanie SIGTERM do wszystkich jego procesów potomnych. Czasami jednak to nie działa.

Czy istnieje polecenie lub narzędzie, które pozwoli mi zabić proces i wszystkie jego procesy potomne w tym samym czasie? Zwykle uciekam się do ręcznego zbierania wszystkich pidek w jednym poleceniu zabicia, ale wydaje mi się to głupie.

To SO pytanie pyta, jak to zrobić z perlem, ale wszystko, co wykona zadanie, byłoby świetnie.

itsadok
źródło
Wygląda na pkill -9to, że jest potężniejszy niż pkillz jakiegokolwiek powodu.
Andrew

Odpowiedzi:

13

Zakładając, że procesy współużytkują identyfikator sesji (co powinny, chyba że jawnie wywołały setsid ()), możesz zabić je w sesji za pomocą pkill:

user@machine:~> ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12916 12804 ps -o pid,sess,cmd -U user
user@machine:~> sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12920 12804 sh
12921 12804 sh
12922 12804 sh
12924 12804 sh
12926 12804 sh
12928 12804 sh
12937 12804 ps -o pid,sess,cmd -U user
sh-3.00$

Jeśli z innego terminala:

pkill -9 -s 12804

Potem wszystko umiera za jednym zamachem.

Możesz podobnie zabijać według grup procesów, chociaż jest to bardziej przydatne dla wielu dzieci, które wszystkie są o jeden poziom poniżej rodzica, a nie łańcucha powiązanych procesów.

James F.
źródło
2

Zazwyczaj odpowiadający klient powinien otrzymać sigterm i sam się wyłączyć, tym samym kończąc wszystkie rozwidlone procesy potomne. Z drugiej strony, jeśli klient nie odpowiada, normalny sygnał zakończenia prawdopodobnie nie wywoła żadnej odpowiedzi.

Następnie przechodzisz do wysyłania SIGKILL, który mówi samemu systemowi, aby zatrzymał proces, teraz - co może zrobić większość razy, z wyjątkiem sytuacji, gdy proces znajduje się w stanie nieprzerwanego uśpienia, jak na przykład oczekiwanie na niektóre operacje we / wy wejście lub podobne.

W takim przypadku nawet SIGKILL nie spowoduje nic w tym procesie; proces potomny prawdopodobnie będzie w podobnym stanie opóźnienia.

Istnieje przypadek graniczny, w którym proces nadrzędny może zostać poprawnie zakończony, ale proces potomny nie jest możliwy do wywołania. Wtedy skończysz z procesem zombie, którego nie można oczyścić, ponieważ jego ojca nie ma, ale na nic nie reaguje. Jedynym sposobem na ich usunięcie jest ponowne uruchomienie; w większości przypadków są one jednak nieszkodliwe, ponieważ jedyne, co robią, to podejmują PID, podczas gdy jakiekolwiek gniazdo, którego próbowali użyć, już zanikło.

towo
źródło
2

Jeśli chcę zabić drzewo procesów Firefoksa, to czy mogę je zabić za pomocą powyższego polecenia „pkill -9 -s firefox”


źródło