top / htop에서 프로세스 트리 종료


12

htop을 사용하면 쉘 내의 프로세스 트리를 멋지게 볼 수 있습니다. 을 누른 F9 (KILL)다음 종료 15 SIGTERM할 작업으로 보낼 신호 (예 :)를 선택하여 프로세스를 종료 할 수 있습니다 .

그러나 이것은 한 번에 하나의 프로세스 만 죽일 수 있습니다. 를 사용하여 전체 프로세스 트리를 종료하는 방법이 htop있습니까?

답변:


16

보낸 사람 man htop:

대화 형 명령

스페이스 태그 지정 또는 프로세스 태그 해제 "kill"과 같은 여러 프로세스에서 작동 할 수있는 명령 은 현재 강조 표시된 프로세스 대신 태그가 지정된 프로세스 목록에 적용됩니다 .

U 모든 프로세스의 태그를 해제합니다 (Space 키로 추가 된 모든 태그 제거).

F9, k "Kill"process : 메뉴에서 선택된 신호를 하나 또는 여러 프로세스 그룹으로 보냅니다. 프로세스에 태그가 지정된 경우, 태그가 지정된 모든 프로세스에 신호를 보냅니다. 태그가 없으면 현재 선택된 프로세스로 보냅니다.

당신이 찾고있는 대답은 아니지만 가깝습니다. 프로세스 그룹 또는 강제 종료 된 자식을 제거 할 수도 있습니다.

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


1

htop 맨 페이지에서 :

F5, t 트리보기 : 부모 단위로 프로세스를 구성하고 이들 간의 관계를 트리로 레이아웃합니다. 키를 전환하면 트리와 이전에 선택한 정렬 뷰간에 전환됩니다. 정렬보기를 선택하면 트리보기가 종료됩니다.

F5를 누르고 't'를 쳐야 할 수도 있습니다. 그러면 전체 트리를 죽일 수 있습니다.


1
"트리"가 필연적으로 부모에 바인딩 된 경우에만 작동합니다. htop은 스레드 그룹을 트리로 표시합니다 (이 경우 브랜치는 실제 프로세스가 아님). 그렇지 않으면, 고아 아이들은 init에 의해 양부되므로 살해되지 않습니다.
goldilocks

나는 이것이 관련 프로세스에 엄격하게 달려 있지만 절대적으로 동의합니다. 예를 들어 ssh tree 세션을 종료하면 기본 하위 프로세스가 종료됩니다. OP는 왜 나무 전체를 죽이고 싶었는지에 대해 구체적이지 않았습니다.
Stephan

1

htops명령을 납치 할 수 있습니다. 에서이 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-hijackhtop을 호출하십시오.

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

그런 다음을 누르면 s대신 해당 명령이 호출됩니다 strace(나중에 기본 화면으로 돌아가려면 Esc를 눌러야 함).


1

오랫동안이 기능이 있었지만 2018 년까지는 매뉴얼에서 누락되었습니다. c키를 눌러 현재 강조 표시된 프로세스와 모든 하위 프로세스를 선택하십시오. 그런 다음 선택한 프로세스에 적용되는 작업 (예 : k키를 사용한 종료 )이 프로세스 및 해당 자식에 적용됩니다.

그러나 이것은 원자 적이 지 않습니다. 만약 당신이 누르는 c순간과 커널이 모든 프로세스를 죽인 순간 사이에 새로운 자식들이 생성된다면 , 그것들은 죽이지 않을 것이며 대부분 init 프로세스에 다시 연결될 것입니다. 선택한 프로세스에서 htop이 루핑되어 하나씩 종료되기 때문입니다.

나는 한 패치 제안 얼마 전에 htop하는 원자 그룹을 죽이는 기능을 추가 할을하지만, 구현은 병합하기위한 합의 충분하지 않았다. 그것으로, htop에서 전체 프로세스 그룹을 원자 적으로 죽일 수 있습니다. 그것은 전체 트리를 죽이는 것과 정확히 동일하지는 않지만 AFAIK는 커널이 임의의 트리를 원자 적으로 죽이는 방법을 제공하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.