Вбивство дерева процесів у top / htop


12

htop дозволяє мені добре бачити дерева процесів всередині оболонки. Я можу вбивати процеси, натискаючи, F9 (KILL)а потім вибираючи, який сигнал (наприклад 15 SIGTERM) я хочу надіслати на роботу для вбивства.

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

Відповіді:


16

Від man htop:

ІНТЕРАКТИВНІ КОМАНДИ

Пробіл або позначте процес. Команди, які можуть працювати в декількох процесах, як-от "знищити", застосовуватимуться над списком тегів , замість виділеного на даний момент.

U Скасувати позначення всіх процесів (видаліть усі теги, додані клавіше пробіл).

F9, k Процес "Убити": посилає сигнал, обраний у меню, одному або групі процесів. Якщо процеси позначені тегами, передає сигнал усім тегам. Якщо жодна з тегів не позначена, надсилає поточно вибраному процесу.

Не зовсім відповідь, яку ви шукали, але близька. Ви також можете усунути групи процесів або дітей з убивством, див.

/programming/392022/best-way-to-kill-all-child-process


1

З сторінки htop:

F5, t Перегляд дерева: впорядковуйте процеси за батьківством та розміщуйте відносини між ними як дерево. Перемикання клавіші переключиться між деревом та попередньо вибраним поданням сортування. Вибір перегляду сортування вийде з дерева.

Тож натисніть F5, і, можливо, вам доведеться потім натиснути "t". Це дозволить вам убити все дерево.


1
Це спрацює лише в тому випадку, якщо "дерево" неминуче пов'язане з його батьківським; зауважте, що htop показує групи ниток як дерева (у цьому випадку гілки не є реальними процесами). В іншому випадку діти-сироти будуть відроджені інітом, тому не будуть вбиті.
goldilocks

Я абсолютно згоден, хоча це суворо залежить від процесів. Убивання сеансу дерева ssh, наприклад, знищить базові програми дітей; ОП не був особливо конкретним щодо того, чому він хотів убити ціле дерево.
Стефан

1

Ви можете захопити htop«s sкоманду. У htop, натискаючи sвиклики strace -p <the-pid-of-the-selected-process>.

Тоді, що ви можете зробити, це створити straceкоманду, яка містить щось на кшталт:

#! /bin/sh -
pids=$(ps -eo pid= -o ppid= |
  awk -v exclude="$PPID" -v pid="$2" '
    function descends(p) {
      if (p == exclude) return 0
      if (p == pid) return 1
      if (p <= 1) return 0
      return descends(parent[p])
    }
    { parent[$1]=$2 }
    END {
      for (p in parent)
        if (descends(p))
         print p
    }'
)
if [ -z "$pids" ]; then
  echo >&2 "No process found to kill"
else
  echo >&2 Killing $pids
  kill $pids
fi

І помістіть його в якийсь каталог, як-от ~/.htop-hijack, і зателефонуйте htop як:

PATH=~/.htop-hijack:$PATH htop

Потім натискання sвикликає цю команду замість strace(потрібно натиснути Esc, щоб потім повернутися на головний екран).


1

Функція для цього була давно, але вона відсутня в посібнику до 2018 року: натисніть cклавішу, щоб вибрати процес, що виділяється на даний момент, а також усіх його дітей. Потім операції, які стосуються вибраних процесів (таке вбивство за допомогою kключа), застосовуються до процесу та його дітей.

Але це не атомно. Якщо нові діти породиться між моментом натискання cі моментом, коли ядро ​​вбило всі процеси, вони не будуть вбиті і, швидше за все, в кінцевому підсумку будуть приєднані до процесу init. Це пов’язано з тим, що htop зациклюється на вибраних процесах і вбиває їх по одному.

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

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