특정 프로그램의 모든 프로세스를 표시해야 합니다. 이렇게 하면 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
프로세스 트리를 모니터링하는 또 다른 방법
myProcess
ID로 호출하는 프로세스가 있다고 가정해 보겠습니다.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
연속 업데이트 간의 차이점 강조