在Linux中使用top -c命令,可以根据进程名称过滤列出的进程。

200
top -c

Top命令可以列出所有进程,使用选项-u可以按用户名过滤进程,但我想知道是否有一种简单的方法可以基于在top命令输出的COMMAND列下列出的进程名来过滤进程。

例如,我希望使用top -某些选项 -进程名子字符串,并且top仅显示命令名称中包含此子字符串的进程ID。

11个回答

270

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

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

top命令的-p选项期望输入一个由逗号分隔的进程ID列表,因此我们在pgrep中使用-d','。pgrep中的-f标志使其匹配命令行而不是程序名称。


18
请记住,如果针对“string_to_match_in_cmd_line”生成了新进程,则它们在top中不会显示出来;您需要退出top并重新运行此命令。 - eugenevd
1
正如eugenevd所说,这对于在调用顶部后启动的新进程是行不通的。 有没有办法做到这一点?我需要运行几个具有相同名称前缀的程序,并且我希望实时查看其中有多少正在运行,而不需要每次执行新的top(或仅ps)。 - Jester
1
@Jester,eugenevd,我和你们遇到了同样的问题。我在https://dev59.com/3Wct5IYBdhLWcg3wedKP#27653841上发布了一个新版本,希望能对你们有所帮助。 - Val
5
我遇到了 top: pid limit (20) exceeded 的提示,所以我使用了这个命令:top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//')。该命令可以列出匹配命令行中特定字符串的进程信息,展示它们的资源占用状况,同时限制最多显示20个进程。 - f01
如果你在macOS上,可以使用以下命令:top -pid $(pgrep -d " -pid " -f -i string_to_match_in_cmd_line) - Vlad

163

可以交互地完成。

运行top -c后,按下o键并在列上编写筛选器,例如,要显示命令列包含字符串foo的行,请编写COMMAND=foo

如果您只想要一些基本输出,那么这可能已经足够了:

top -bc |grep name_of_process

9
这让我得到了“选项无效或语法错误:-bc”。 - shmim
5
使用 top -bc -n 1 更方便,因为它将迭代次数限制为1。 - galath
4
这应该是被接受的答案。它更准确,并且仅使用“top”命令提供的选项,而且它可以显示新的进程。 - Abraham Toledo
进程一直消失和出现,可以使用 top -c 命令,然后按下 o 键并在列上编写过滤器。 - MrR

127

top运行时,您可以添加过滤器。只需按下o键,然后输入过滤器表达式。

例如,要监视所有包含字符串“java”的进程,请使用过滤器表达式COMMAND=java

您可以再次按下o键添加多个过滤器。

您可以使用u按用户进行筛选。使用=清除所有过滤器。


4
这个方案比被采纳的答案更好(比原版晚三年提出)。与原版不同,这个方案也适用于新生成的进程。如果您正在监控按需创建的Apache进程,则非常重要。 - Nate Lampton
3
确实,这是更好的解决方案,因为它可以实时筛选。 接受的解决方案在运行 top 前解析了进程 ID。得到的进程就像top -c -p 920,1345,1346一样固定。 - Jérôme Gillard
6
在某些(较旧的)版本的top中,使用o作为过滤器是不存在的:top: procps version 3.2.8。用户过滤器存在,因此可以使用。 - Manwe
我觉得过滤器是“与”逻辑,默认情况下是这样的。怎么才能实现“或”逻辑呢? - aquib nawaz
有没有办法保存我的筛选选项,或者从命令行调用类似于 CPU>0.0 的过滤器? - Dan
在 macOS 上,我遇到了“错误:无效的命令:COMMAND=node”。是的,我意识到这个问题标记为 Linux,但这样可以让大家知道在 macOS 上的操作方式有所不同。 - Mike Graf

13

@perreal的命令很好用!如果你忘记了,请分两步来尝试...

例如:筛选顶部以仅显示名为yakuake的应用程序:

$ pgrep yakuake
1755

$ top -p 1755

有用的顶部互动命令 'c':切换全路径与命令名称 'k':通过PID结束进程 'F':按...筛选,使用箭头选择,然后按's'设置排序

下面的回答也很好......我今天正在寻找它,但找不到。谢谢


9

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

这缺少了关于系统工作负载的概述。在休眠前添加“uptime”,对于短进程列表来说,我认为这已经足够了。 - Sevyls
1
@Sevyls 感谢您指出!经过其他几次尝试(效果不如您的版本),您的版本可能是最好的之一。回答已修改。 - Val
如果我有一个或多个匹配的进程正在运行,它可以很好地工作,但是当所有进程停止时,会出现“top: Invalid user”的错误。当另一个进程启动时,它会恢复正常。我在Raspbian上运行。谢谢。 - Mike

6
htop 中,你可以直接使用搜索功能:
/process-name

3
很遗憾,htop并不总是可用的,而且您可能没有权限添加它。 - Alexis Wilke

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选项进行过滤的旧版top的用户,这里提供了一个可编写脚本的示例,以获取全屏/控制台输出(此输出缺少摘要信息)。
__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

对于使用Mac的人,top命令不支持其他答案中展示的过滤方式(并且pgrep参数略有不同)......该函数将启动符合第一个参数模式(根据pgrep)的进程的top,并传递任何其他传递给top的参数。

function topnamed() {
    name=$1
    shift
    top -pid $(pgrep -d ' -pid ' -fi "$name") $@
}

(“i”在“-fi”中表示不区分大小写。)
基本示例,显示任何“python”进程:
topnamed python

带有顶部额外参数的示例:

topnamed python -o mem

它的缺点(其他答案中提到)是仅包括启动时的进程。

1
在macOS 12.6.1上,每个匹配项之间都会打印分隔符。不需要使用99999999。top -pid $(pgrep -d ' -pid ' -fi "$name") $@工作正常。 - Vlad
谢谢!我现在也看到它在我的电脑上运行了。我从答案中删除了解决方法。 - ecp

0

这个怎么样?

top -c -p <PID>

4
我们正试图通过进程名称(或其子字符串)进行筛选,当您重新启动进程时,将会获得新的进程 ID。 - Srujan Kumar Gulla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接