Як вбити дерево процесів в Linux? [зачинено]


14

Іноді надсилання SIGTERM до процесу призведе до того, що він надсилає SIGTERM всім його дочірнім процесам. Однак іноді це не працює.

Чи є команда чи утиліта, яка дозволить мені вбити процес і всі його дочірні процеси одночасно? Зазвичай я вдаюсь до того, щоб вручну збирати всі пліди в одну команду kill, але це почувається дурним.

Це питання задає питання, як це зробити за допомогою perl, але все, що може зробити цю роботу, було б чудово.


Схоже, pkill -9це потужніше, ніж pkillз будь-якої причини.
Андрій

Відповіді:



13

Якщо припустити, що процеси мають спільний ідентифікатор сеансу (який вони повинні, якщо вони явно не називають setid (), ви можете вбити їх шляхом сеансу за допомогою 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$

Якщо з іншого терміналу я роблю:

pkill -9 -s 12804

Потім все вмирає одним махом.

Можна аналогічно вбити за групою процесів, хоча це, як правило, корисніше для багатьох дітей, які всі на один рівень нижче батьків, а не ланцюжок пов'язаних процесів.


2

Зазвичай клієнт, що відповідає, повинен отримувати сигнали та вимикатись, тим самим припиняючи всі свої роздвоєні дочірні процеси. Якщо, з іншого боку, клієнт не відповідає, звичайний сигнал про припинення, ймовірно, не викликає відповіді.

Тоді ви продовжуєте надсилати SIGKILL, який повідомляє самій системі зробити, щоб цей процес припинився. вхід чи подібне.

У такому випадку навіть SIGKILL в кінцевому підсумку нічого не зробить; дитячий процес, ймовірно, буде в подібному стані загальмованості.

Існує прикордонний випадок, коли батьківський процес може закінчитися просто непогано, але дочірній процес не підлягає порушенню. Тоді ви закінчите процес зомбі, який неможливо прибрати, оскільки його батька немає, але він нічого не реагує. Єдиний спосіб позбутися від них - це перезавантаження; Однак у більшості випадків вони є досить нешкідливими, оскільки єдине, що вони роблять, - це взяти PID, тоді як будь-який сокет, який вони намагалися використати, вже вимер.


2

Якщо я хочу вбити дерево процесора Firefox, то чи можна його вбити за допомогою наведеної вище команди "pkill -9 -s firefox"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.