在linux中使用top -c命令来过滤基于进程名称列出的进程

top -c 

最上面列出了所有的进程,有很好的select,通过使用选项-u筛选进程的用户名,但我想知道是否有任何简单的方法来过滤基于顶部输出的COMMAND列下列出的进程名的进程。

例如,我想要像top -some选项-substring的processname和top显示pids只有这个子string的命令名

使用pgrep来获得匹配命令行的pid:

 top -c -p $(pgrep -d',' -f string_to_match_in_cmd_line) 

顶部-p期望逗号分隔的pid列表,所以我们在pgrep中使用-d',' 。 pgrep中的-f标志使其与命令行相匹配,而不是程序名称。

它可以交互地完成

在运行top -c ,敲入o并在列上写一个filter,例如显示COMMAND列包含stringfoo的行,写入COMMAND=foo

如果你只是想要一些基本的输出这可能就足够了:

 top -bc |grep name_of_process 

您可以在运行时将filter添加到top ,只需按下o键,然后键入filterexpression式即可。 例如,要监视所有的java进程,使用filterexpression式COMMAND=java 。 您可以通过再次按下键来添加多个filter,您可以通过用户使用u键进行过滤,并且可以使用=键清除所有filter。

@ perreal的命令很棒! 如果你忘了,试试两个步骤…

例如:filter顶部只显示名为yakuake的应用程序:

 $ pgrep yakuake 1755 $ top -p 1755 

有用的顶部交互式命令'c':切换完整path与命令名'k':由PID'F'杀死:按…过滤…用箭头select…然后按's'设置sorting

下面的答案也是好的…我今天正在寻找,但找不到它。 谢谢

在StackOverflow上寻找这么多的答案后,我没有看到一个适合我的需求的答案。

也就是说,要使用给定的关键字来保持最新的命令,并且当新的进程产生时我们不必一次又一次地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;) 

修改__关键字,它应该工作。 (Ubuntu 2.6.38testing)

2.14.2015补充说:上面的代码中缺less系统工作负载部分。 对于那些关心“平均负载”的人来说:

 __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;) 

那这个呢?

 top -c -p <PID> 

我结束了使用下面的代码的shell脚本:

 #!/bin/bash while [ 1 == 1 ] do clear ps auxf |grep -ve "grep" |grep -E "MSG[^\ ]*" --color=auto sleep 5 done