Answers:
使用pgrep获取pid的匹配命令行:
top -c -p $(pgrep -d',' -f string_to_match_in_cmd_line)
top -p
期望以逗号分隔的pid列表,因此我们-d','
在pgrep中使用。-f
pgrep中的标志使其与命令行而不是程序名称匹配。
top: pid limit (20) exceeded
所以我用了这个:top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//')
。
可以交互式完成
运行后top -c
,o在列上命中并写入一个过滤器,例如要显示其中COMMAND列包含字符串foo的行,请写COMMAND=foo
如果只需要一些基本输出,则可能已足够:
top -bc |grep name_of_process
top -bc -n 1
更为方便,因为它将迭代次数限制为
top -c , hit o and write a filter on a column
。
您可以在top
运行时向其添加过滤器,只需o按键,然后键入过滤器表达式。例如,要监视所有Java进程,请使用filter表达式COMMAND=java
。您可以通过再次按键来添加多个过滤器,可以通过用户使用u键进行过滤,也可以使用键来清除所有过滤器=。
top -c -p 920,1345,1346
是固定的。
o
的过滤器不会在顶部的一些(旧的)版本存在:top: procps version 3.2.8
用户过滤器存在,这样做的工作。
@perreal的命令效果很好!如果您忘记了,请分两个步骤尝试...
示例:过滤顶部以仅显示名为yakuake的应用程序:
$ pgrep yakuake
1755
$ top -p 1755
有用的顶部交互式命令'c':切换全路径与命令名'k':按PID终止'F':按...过滤...用箭头选择...然后按's'设置排序
下面的答案也很好...我今天一直在寻找,但找不到。谢谢
在StackOverflow上查找了这么多答案之后,我还没有找到适合我需求的答案。
也就是说,使top命令使用给定的关键字保持刷新,并且当新进程产生时,我们不必一次又一次地按CTRL + C / top。
因此,我做了一个新的...
这里是不需要重新启动的版本。
__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; sleep 1; done;)
修改__keyword,它应该可以工作。(已测试Ubuntu 2.6.38)
2015年2月14日添加:上面的代码缺少系统工作负载部分。对于关心“平均负载”部分的人:
__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; uptime; sleep 1; done;)
当进程列表超过20个进程时,大多数答案都将失败。那是top -p
期权限制。对于那些顶部顶部不支持使用o
选项进行过滤的用户,这是一个可编写脚本的示例,用于获取全屏/控制台输出(此输出中缺少摘要信息)。
__keyword="YOUR_FILTER" ; ( FILL=""; for i in $( seq 1 $(stty size|cut -f1 -d" ")); do FILL=$'\n'$FILL; done ; while :; do HSIZE=$(( $(stty size|cut -f1 -d" ") - 1 )); (top -bcn1 | grep "$__keyword"; echo "$FILL" )|head -n$HSIZE; sleep 1;done )
一些解释
__keyword = your grep filter keyword
HSIZE=console height
FILL=new lines to fill the screen if list is shorter than console height
top -bcn1 = batch, full commandline, repeat once