183
top -c

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

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

4

11 回答 11

256

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

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

top-p需要一个逗号分隔的 pid 列表,所以我们-d','在 pgrep 中使用。pgrep 中的-f标志使其匹配命令行而不是程序名称。

于 2012-08-22T14:49:19.657 回答
150

它可以交互完成

运行后top -c,点击o并在列上编写过滤器,例如显示 COMMAND 列包含字符串 foo 的行,写入COMMAND=foo

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

top -bc |grep name_of_process
于 2014-06-17T21:25:05.930 回答
116

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

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

o您可以通过再次按来添加多个过滤器。

您可以按用户过滤u。用 清除所有过滤器=

于 2016-01-09T01:58:18.443 回答
13

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

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

$ pgrep yakuake
1755

$ top -p 1755

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

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

于 2014-06-17T20:50:59.267 回答
8

在 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 测试)

2.14.2015 添加:上面的代码缺少系统工作负载部分。对于关心“平均负载”部分的人:

__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;)
于 2014-12-26T06:54:27.467 回答
5

htop中,您可以简单地搜索

/process-name
于 2019-12-23T12:43:16.013 回答
1

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

#!/bin/bash

while [ 1 == 1 ]
do
    clear
    ps auxf |grep -ve "grep" |grep -E "MSG[^\ ]*" --color=auto
    sleep 5
done
于 2015-11-10T14:21:12.207 回答
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
于 2017-11-21T08:45:30.487 回答
0

那这个呢?

top -c -p <PID>
于 2012-08-22T16:32:06.773 回答
0

这个期望脚本将按名称过滤进程并显示新创建的进程。它基本上是通过为您发送 'o' 和 'COMMMAND=my_program' 来自动化用户与 top 的交互。类似于@nos 答案。

文件:topname.exp

#!/usr/bin/expect -- 

if {[llength $argv] < 1 } {
  send_user "Usage: topname process_name top_cmd_args \n"
  exit 1
}
set keyword [lindex $argv 0]

spawn top {*}[lrange $argv 1 end]


expect {

    -re .
     {
        send "o\r"
        expect "*add filter*"
        send "COMMAND=${keyword}\r"
        interact
    }
    
}

所以你会像这样使用它:

./topname.exp my_program

./topname.exp java# this filters java processes

它还传递了 top 接受的其他标志,例如 -u

./topname.exp java -u root# this filters java processes by root user

./topname.exp java -u root -d 1# this filters java processes by root user and delay top update by 1 second

于 2021-04-13T09:51:03.840 回答
0

对于 Mac 上的任何人,其中 top 不支持其他答案中显示的那种过滤(并且 pgrep args 略有不同)......此函数将为匹配第一个 arg 中的模式的进程启动 top (根据pgrep),并将任何其他参数传递给顶部。

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

(“-fi”中的“i”使其不区分大小写。)

显示任何“python”进程的基本示例:

topnamed python

带有顶部附加参数的示例:

topnamed python -o mem

除非我遗漏了某些东西,否则 pgrep (至少在当前版本的 MacOS 中)会添加一个尾随分隔符,即使手册页说它是“要在每个之间打印”。所以最后的 99999999 是一个虚拟值,以防止它爆炸。(也许有更好的解决方法。)

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

于 2021-08-16T19:18:11.243 回答