프로그램의 프로세스 트리를 표시할 수 있나요?

프로그램의 프로세스 트리를 표시할 수 있나요?

특정 프로그램의 모든 프로세스를 표시해야 합니다. 이렇게 하면 top -p PID프로그램만 나옵니다.

top -p 381 extra_args받기 위해 들어가고 싶다

  PID USER      PR  NI    VIRT    RES  %CPU  %MEM     TIME+ S COMMAND                                                                            
  381 root      20   0 8715.7m  12.5m   0.0   0.3   0:48.42 S  `- /usr/bin/program          
10034 root      20   0 8476.3m   2.3m   0.0   0.1   0:00.03 S      `- -/usr/bin/sh                                                            
10036 root      20   0 8488.3m   2.2m   0.0   0.1   0:00.01 S          `- /usr/bin/sh ./login.sh                                              
10037 root      20   0    3.9m   3.1m   0.0   0.1   0:00.54 S              `- /usr/bin/bash --login +h                                           
19995 root      20   0 8506.3m   2.4m   0.0   0.1   0:00.01 S      `- -/usr/bin/sh                                                            
19997 root      20   0 8512.3m   2.2m   0.0   0.1   0:00.01 S          `- /usr/bin/sh ./login.sh                                              
19998 root      20   0    3.9m   3.1m   0.0   0.1   0:00.89 S              `- /usr/bin/bash --login +h                                           
30644 root      20   0    2.8m   2.1m   0.0   0.1   0:00.03 S                  `- make -j8                                                       
30647 root      20   0    2.8m   2.0m   0.0   0.1   0:00.01 S                      `- make all-recursive                                         
30648 root      20   0    2.2m   1.4m   0.0   0.0   0:00.00 S                          `- /bin/sh -c fail=; \ if (target_option=k; case ${targe+ 
30661 root      20   0    2.8m   2.1m   0.0   0.1   0:00.06 S                              `- make all-am                                        
30671 root      20   0    2.4m   1.6m   0.0   0.0   0:00.04 S                                  `- /bin/sh ./libtool --silent --tag=CC --mode=co+ 
30808 root      20   0    3.9m   0.3m   0.0   0.0   0:00.00 S                                      `- gcc -DHAVE_CONFIG_H -I. -I.. -I./include + 
30816 root      20   0  132.3m 117.7m  98.7   3.1   0:43.18 R                                          `- /usr/libexec/gcc/aarch64-unknown-linu+ 
30675 root      20   0    2.4m   1.6m   0.0   0.0   0:00.04 S                                  `- /bin/sh ./libtool --silent --tag=CC --mode=co+ 
31230 root      20   0    3.9m   0.3m   0.0   0.0   0:00.00 S                                      `- gcc -DHAVE_CONFIG_H -I. -I.. -I./include + 
31231 root      20   0   88.3m  76.6m  99.4   2.0   0:20.08 R                                          `- /usr/libexec/gcc/aarch64-unknown-linu+ 
31074 root      20   0    2.4m   1.6m   0.0   0.0   0:00.05 S                                  `- /bin/sh ./libtool --silent --tag=CC --mode=co+ 
31274 root      20   0    3.9m   0.3m   0.0   0.0   0:00.00 S                                      `- gcc -DHAVE_CONFIG_H -I. -I.. -I./include  

top -p 381주는 대신

  PID USER      PR  NI    VIRT    RES  %CPU  %MEM     TIME+ S COMMAND                                                                            
  381 root      20   0 8715.7m  12.5m   0.0   0.3   0:48.42 S  `- /usr/bin/program  

이것이 나의 주요 사용법입니다

top -hv | -bcEeHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols]

답변1

top아마도 작업에 적합한 도구가 아닐 수도 있습니다.

ps일종의 유용하지만 트리의 모든 PID를 알아야 하므로 전체 목적이 무산됩니다.

ps u -p 2307,2312,2334,9379 --ppid 2307,2312,2334,9379 --forest
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      2307  0.0  0.0   2200   264 ?        Ss   Dec15   0:00 runsv eto-netnses
eto       2312  0.0  0.0   2748   420 ?        S    Dec15   0:00  \_ s6-svscan netnses
eto       2334  0.0  0.0   2756   416 ?        S    Dec15   0:00      \_ s6-supervise netns-nsholder-vpn-tunnel
eto       9379  0.0  0.0   2184   300 ?        Ss   Dec17   0:00          \_ netns-nsholder-daemon

가장 간단한 방법은 pstree트리를 그릴 수 있지만 추가 정보를 출력하는 기능이 부족한 를 사용하는 것입니다.

: pstree -p 2307 -a -u                                           
runsv,2307 eto-netnses
  └─s6-svscan,2312,eto netnses
      └─s6-supervise,2334 netns-nsholder-vpn-tunnel
          └─pause,9379

프로세스 트리의 세션 ID를 얻을 수 있고 해당 트리의 모든 프로세스가 동일한 세션에서 실행 중인 경우 해당 SID를 ps --forest형식 선택기로 사용할 수 있지만 제 경우에는 ps여기에서 작동하지 않기 때문에 중단됩니다. 경계 모드가 교차되었습니다. 이것이 여기서 일어나는 일입니다( pause일명 netns-nsholder-daemon새 SID에서 실행 중이므로 위 목록이 누락되었습니다).

: ps -p 2307 -o pid,sess
  PID  SESS
 2307  2307
: ps u -s 2307 --forest 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      2307  0.0  0.0   2200   264 ?        Ss   Dec15   0:00 runsv eto-netnses
eto       2312  0.0  0.0   2748   420 ?        S    Dec15   0:00  \_ s6-svscan netnses
eto       2334  0.0  0.0   2756   416 ?        S    Dec15   0:00      \_ s6-supervise netns-nsholder-vpn-tunnel

이 시점에서 나는 당신이 아마도 더 나아질 것이라고 믿습니다 htop.

답변2

쉽고 직접적인 방법은 없습니다. pid 및 하위 pid에 대한 최상위 새로 고침 기능을 정말로 원한다면 명령줄에서 pgrep와 같은 것을 사용할 수 있습니다.

관심 있는 PID가 다음 명령인 경우 1234다음 명령이 작동합니다.

top -p 1234 -p `pgrep -P 1234 -d,`

pgrep상위 프로세스 1234가 있는 모든 프로세스를 찾고 쉼표 구분 기호를 사용합니다.

이에 대한 몇 가지 제한 사항이 있습니다.

  • "다시 검색"되지 않으므로 새로운 하위 프로세스가 있으면 표시되지 않습니다.
  • 전체 트리를 찾지 못하고 요청된 자식 프로세스만 찾게 되므로 자식의 자식은 나타나지 않습니다.
  • 기존의 상위 필터가 모두 작동하며 이는 원하는 것일 수도 있고 아닐 수도 있습니다. 유휴 프로세스(상단의 i 명령)를 표시하지 않으므로 처음에는 상단에 아무 것도 표시되지 않습니다. 보여주려면 저를 누르세요.

답변3

프로세스 트리를 모니터링하는 또 다른 방법

myProcessID로 호출하는 프로세스가 있다고 가정해 보겠습니다.1234

watch -d -n 1 "pstree -a 1234"

또는

watch -d -n 1 "pstree -a `pgrep -f myProcess`"

그러면 새 창에 프로세스 트리가 표시되어 매초 업데이트되고 각 업데이트 간의 변경 사항이 강조 표시됩니다.

watch중단될 때까지 실행됩니다. ( ctrl-c)

요약

pgrep -f <command>명령의 프로세스 ID만 반환합니다.

pstree프로세스 트리를 표시합니다.

  • -a명령줄 매개변수 표시
  • (필요에 따라 pstree 매개변수를 변경할 수 있습니다. pstree 매뉴얼 페이지를 참조하세요.)

watch명령을 반복적으로 실행하고 출력을 표시합니다.

  • -n <n>n초마다 실행
  • -d연속 업데이트 간의 차이점 강조

관련 정보