linux中的top -c命令可根据进程名过滤列出的进程


149
top -c

顶部列出了所有进程,有很好的选项可以使用-u选项按用户名过滤进程,但是我想知道是否有任何简单的方法可以根据顶部输出的COMMAND列下列出的进程名来过滤进程。

例如,我想要top -some option -processname的子字符串,并且top显示pid的命令名称中仅包含此子字符串

Answers:


213

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

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

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


12
只要记住,如果为“ string_to_match_in_cmd_line”生成了新进程,它们将不会显示在顶部;您必须退出顶部并重新运行此命令
eugenevd 2013年

1
正如eugenevd所说,这不适用于在调用top之后启动的新进程。有什么办法吗?我需要运行几个名称带有相同前缀的程序,我很想看看其中有多少以实时方式运行,而不必每次都执行一个新的top(或者只是一个ps)。
小丑2014年

1
@ Jester,eugenevd,我遇到了与您相同的问题。我在stackoverflow.com/a/27653841/681830上做了一个新版本,希望对您有所帮助。
2014年

5
我遇到了,top: pid limit (20) exceeded所以我用了这个:top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//')
f01

115

可以交互式完成

运行后top -co在列上命中并写入一个过滤器,例如要显示其中COMMAND列包含字符串foo的行,请写COMMAND=foo

如果只需要一些基本输出,则可能已足够:

top -bc |grep name_of_process

7
这给了我“无效的选项或语法:-bc”
shmim 2015年

3
top -bc -n 1 更为方便,因为它将迭代次数限制为
1。– galath

1
这应该是公认的答案。它更加精确,并且仅与“ top”命令提供的选项一起使用。它确实显示了新的过程。
亚伯拉罕TS '18

的过程不断消失,并再次出现top -c , hit o and write a filter on a column
MrR

92

您可以在top运行时向其添加过滤器,只需o按键,然后键入过滤器表达式。例如,要监视所有Java进程,请使用filter表达式COMMAND=java。您可以通过再次按键来添加多个过滤器,可以通过用户使用u键进行过滤,也可以使用键来清除所有过滤器=


2
这是比接受的答案更好的解决方案(此解决方案比原始答案晚了3年)。与原始解决方案不同,该解决方案实际上也适用于新生成的进程。如果要监视按需创建的Apache进程,则非常重要。
Nate Lampton

2
确实是一个更好的解决方案,因为它可以实时过滤。接受的解决方案在运行top之前先解析进程ID。结果过程就像top -c -p 920,1345,1346是固定的。
杰罗姆吉拉德

4
使用o的过滤器不会在顶部的一些(旧的)版本存在:top: procps version 3.2.8用户过滤器存在,这样做的工作。
Manwe

13

@perreal的命令效果很好!如果您忘记了,请分两个步骤尝试...

示例:过滤顶部以仅显示名为yakuake的应用程序:

$ pgrep yakuake
1755

$ top -p 1755

有用的顶部交互式命令'c':切换全路径与命令名'k':按PID终止'F':按...过滤...用箭头选择...然后按's'设置排序

下面的答案也很好...我今天一直在寻找,但找不到。谢谢


7

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

这缺少有关系统工作负载的概述。在睡眠前添加“正常运行时间”,对于简短的流程列表,这是足够的恕我直言。
Sevyls 2015年

1
@Sevyls感谢您指出!经过几次其他尝试(效果不佳)之后,您的版本可能是最好的版本之一。答案已修改。
2015年

如果我有一个或多个运行该匹配项的进程运行良好,但在所有进程停止时却得到“ top:无效用户”,效果很好。当另一个进程开始时,它确实会恢复。我正在运行Raspbian FYI。谢谢。
迈克

1

那这个呢?

top -c -p <PID>

4
我们正在尝试按进程名(或其子字符串)进行过滤,当您重新启动进程时,您将获得一个新的pid。
Srujan Kumar Gulla,2012年

1

我最终使用带有以下代码的shell脚本:

#!/bin/bash

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

1

当进程列表超过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

1

在中htop,您可以简单地使用搜索

/process-name
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.