我需要显示某个程序下的所有进程。如果我这样做,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
突出显示连续更新之间的差异