Zabicie drzewa procesów w top / htop


12

htop pozwala mi ładnie zobaczyć drzewa procesów w skorupie. Mogę zabijać procesy, naciskając, F9 (KILL)a następnie wybierając sygnał (np. 15 SIGTERM), Który chcę wysłać do zadania, aby zabić.

Jednak pozwala mi to zabić tylko jeden proces naraz. Czy istnieje sposób na zabicie pełnego drzewa procesów za pomocą htop?

Odpowiedzi:


16

Od man htop:

POLECENIA INTERAKTYWNE

Spacja lub odznakuj proces. Polecenia, które mogą działać na wielu procesach, takie jak „zabij”, zostaną następnie zastosowane na liście oznaczonych procesów , zamiast aktualnie wyróżnionego.

U Odznacz wszystkie procesy (usuń wszystkie tagi dodane za pomocą klawisza spacji).

F9, k Proces „zabicia”: wysyła sygnał wybrany w menu do jednego lub grupy procesów. Jeśli procesy zostały oznaczone, wysyła sygnał do wszystkich oznakowanych procesów. Jeśli żaden nie jest oznaczony, wysyła do aktualnie wybranego procesu.

Nie do końca odpowiedź, której szukasz, ale blisko. Możesz także wyeliminować grupy procesów lub dzieci zabijając, patrz:

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


1

Ze strony podręcznej:

F5, t Widok drzewa: organizuj procesy według rodzicielstwa i układaj relacje między nimi jako drzewa. Przełączenie klawisza spowoduje przełączenie między drzewem a wcześniej wybranym widokiem sortowania. Wybranie widoku sortowania spowoduje zamknięcie widoku drzewa.

Więc wciśnij F5 i być może będziesz musiał nacisnąć „t”. To pozwoli ci zabić całe drzewo.


1
Działa to tylko wtedy, gdy „drzewo” jest nieuchronnie związane z rodzicem; zauważ, że htop pokazuje grupy wątków jako drzewa (w takim przypadku gałęzie nie są rzeczywistymi procesami). W przeciwnym razie osierocone dzieci zostaną ponownie wychowane przez init, więc nie zostaną zabite.
goldilocks

Absolutnie się zgadzam, choć zależy to wyłącznie od zaangażowanych procesów. Zabicie sesji drzewa ssh zabije na przykład podstawowe procesy dzieci; OP nie był szczególnie konkretny, dlaczego chciał zabić całe drzewo.
Stephan

1

Można przejąć htop„s spolecenie. W htop, naciśnięcie swywołuje strace -p <the-pid-of-the-selected-process>.

Następnie możesz utworzyć stracepolecenie zawierające coś takiego:

#! /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

I umieść go w jakimś katalogu ~/.htop-hijack, i wywołaj htop jako:

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

Następnie naciśnięcie sspowoduje wywołanie tego polecenia zamiast strace(musisz nacisnąć Esc, aby później powrócić do ekranu głównego).


1

Od dawna istnieje taka funkcja, ale nie było jej w instrukcji do 2018 roku: naciśnij cklawisz, aby wybrać aktualnie podświetlony proces, a także wszystkie jego dzieci. Następnie operacje dotyczące wybranych procesów (takie zabijanie za pomocą kklucza) dotyczą procesu i jego elementów podrzędnych.

To jednak nie jest atomowe. Jeśli odradzają się nowe dzieci między momentem naciśnięcia ca momentem, w którym jądro zabije wszystkie procesy, nie zostaną zabite i najprawdopodobniej zostaną ponownie przyłączone do procesu init. Wynika to z faktu, że htop zapętla wybrane procesy i zabija je jeden po drugim.

Ja proponuje poprawkę do dodawania funkcji grupy atomowej zabijania do htop jakiś czas temu, ale realizacja nie była konsensusie na tyle na to, aby zostać połączone. Dzięki niemu można zabić całą grupę procesów atomowo z htopa. To nie jest dokładnie to samo, co zabicie całego drzewa, ale AFAIK, jądro nie zapewnia żadnego sposobu na zabicie dowolnego drzewa atomowo.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.