Убить дерево процессов в top / htop

12

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

Однако это позволяет мне убивать только один процесс за раз. Есть ли способ убить полное дерево процессов, использующих htop?

Амелио Васкес-Рейна
источник

Ответы:

16

От man htop:

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

Пробел или разметить процесс. Команды, которые могут работать с несколькими процессами, такими как «kill», будут затем применяться к списку помеченных процессов вместо выделенного в данный момент.

U Отключить все процессы (удалить все теги, добавленные с помощью клавиши пробела).

F9, k Процесс «Kill»: отправляет сигнал, выбранный в меню, одному или группе процессов. Если процессы были помечены, отправляет сигнал всем помеченным процессам. Если ни один не помечен, отправляет выбранному процессу.

Не совсем ответ, который вы искали, но близко. Вы также можете исключить группы процессов или дочерние объекты с помощью kill, смотрите:

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

лютик золотистый
источник
1

Из справочной страницы htop:

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

Поэтому нажмите F5, и вам, возможно, придется нажать «t». Это позволит вам убить все дерево.

Stephan
источник
1
Это будет работать только в том случае, если «дерево» неизбежно связано с его родителем; обратите внимание, что htop показывает группы потоков в виде деревьев (в этом случае ветви не являются реальными процессами). В противном случае дети-сироты будут заново родиться с помощью init, поэтому не будут убиты.
Златовласка
Я абсолютно согласен, хотя это зависит строго от вовлеченных процессов. Например, уничтожение сеанса 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и моментом, когда ядро ​​убило все процессы, они не будут уничтожены и, скорее всего, будут подключены к процессу инициализации. Это потому, что htop зацикливается на выбранных процессах и убивает их одного за другим.

Я предложил патч для добавления функции атомарного уничтожения групп в htop некоторое время назад, но реализация не была достаточно согласованной, чтобы ее можно было объединить. С его помощью можно полностью убить целую группу процессов из htop. Это не совсем то же самое, что убить целое дерево, но AFAIK, ядро ​​не предоставляет никакого способа убить произвольное дерево атомарно.

Arkanosis
источник