Matando uma árvore de processos no topo / htop

12

O htop me permite ver árvores de processos dentro do shell. Eu posso matar processos pressionando F9 (KILL)e selecionando o sinal (por exemplo 15 SIGTERM) que quero enviar para um trabalho para matar.

No entanto, isso só me permite matar um processo de cada vez. Existe uma maneira de matar uma árvore completa de processos usando htop?

Amelio Vazquez-Reina
fonte

Respostas:

16

De man htop:

COMANDOS INTERATIVOS

Identifique espaço ou desmarque um processo. Os comandos que podem operar em vários processos, como "matar", serão aplicados sobre a lista de processos marcados , em vez do atualmente destacado.

U Desmarque todos os processos (remova todas as tags adicionadas com a tecla Espaço).

F9, k Processo "Kill": envia um sinal que é selecionado em um menu para um ou um grupo de processos. Se os processos foram marcados, envia o sinal para todos os processos marcados. Se nenhum estiver marcado, envia para o processo atualmente selecionado.

Não é exatamente a resposta que você estava procurando, mas está perto. Você também pode eliminar grupos de processos ou crianças com morte, consulte:

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

Cachinhos Dourados
fonte
1

Na página de manual do htop:

F5, t Visualização em árvore: organize os processos por paternidade e organize as relações entre eles como uma árvore. A alternância da tecla alterna entre a árvore e a visualização de classificação selecionada anteriormente. Selecionar uma exibição de classificação sairá da exibição em árvore.

Então, pressione F5 e talvez seja necessário pressionar 't'. Isso permitirá que você mate a árvore inteira.

Stephan
fonte
1
Isso só funcionará se a "árvore" estiver inevitavelmente ligada ao seu pai; observe que o htop mostra grupos de threads como árvores (nesse caso, as ramificações não são processos reais). Caso contrário, os filhos órfãos serão pais novamente pelo init, portanto não serão mortos.
GOLDILOCKS
Eu concordo absolutamente, embora isso dependa estritamente dos processos envolvidos. Matar uma sessão em árvore ssh matará os processos filhos subjacentes, por exemplo; o OP não foi particularmente específico sobre o motivo pelo qual ele queria matar uma árvore inteira.
5133 Stephan
1

Você pode seqüestrar htopo scomando. Em htop, pressionar schama strace -p <the-pid-of-the-selected-process>.

Então, o que você pode fazer é criar um stracecomando que contenha algo como:

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

E coloque-o em algum diretório como ~/.htop-hijacke chame htop como:

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

Em seguida, pressionar sinvocaria esse comando em vez de strace(você precisa pressionar Esc para retornar à tela principal posteriormente).

Stéphane Chazelas
fonte
1

Há um recurso para isso há muito tempo, mas estava ausente do manual até 2018: pressione a ctecla para selecionar o processo realçado no momento, bem como todos os seus filhos. Em seguida, as operações que se aplicam aos processos selecionados (como uma morte usando a kchave) se aplicam ao processo e seus filhos.

Isso não é atômico, no entanto. Se surgirem novos filhos entre o momento em que você pressiona ce o momento em que o kernel matou todos os processos, eles não serão mortos e provavelmente acabarão sendo anexados novamente ao processo init. Isso ocorre porque o htop está repetindo os processos selecionados e matando-os um por um.

Eu tenho proposto um patch para adicionar um recurso de matando grupo atômica para htop um tempo atrás, mas a implementação não foi suficiente consensual para que possa ser mescladas. Com isso, é possível matar todo um grupo de processos atomicamente do htop. Isso não é exatamente o mesmo que matar uma árvore inteira, mas AFAIK, o kernel não fornece nenhuma maneira de matar uma árvore arbitrária atomicamente.

Arkanosis
fonte