在 linux 中使用 top-c 命令根据 processname 筛选列出的进程

top -c

Top 列出了所有的进程,有很多好的选项可以通过使用选项 -u 根据用户名过滤进程,但是我想知道是否有什么简单的方法可以根据 Top 输出的 COMMAND 列中列出的进程名过滤进程。

例如,我希望像 top-some 选项-processname 的子字符串,top 显示在其命令名中只有这个子字符串的 pids

247820 次浏览

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

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

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

这个怎么样?

top -c -p <PID>

@ perreal 的命令很好用! 如果你忘了,试试两步..。

过滤器顶部只显示名为 yakuake 的应用程序:

$ pgrep yakuake
1755


$ top -p 1755

有用的顶级交互式命令 ‘ c’: 切换完整路径与命令名 “ k”: 通过 PID 杀死 ‘ F’: 通过... 用箭头选择... 然后按‘ s’设置排序

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

它可以交互式地完成

在运行 top -c之后,按下 并在一列上写入一个过滤器,例如,要显示 COMMAND 列包含字符串 foo 的行,写入 COMMAND=foo

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

top -bc |grep name_of_process

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

修改 _ _ 关键字,它应该可以工作

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

我最终使用了一个 shell 脚本,代码如下:

#!/bin/bash


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

可以在 top运行时向它添加过滤器。只需按下 键,然后键入一个过滤器表达式。

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

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

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

当进程列表超过20个进程时,大多数答案都会失败,这就是 top -p选项限制。 对于那些旧的 top 不支持使用 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

htop中,您可以简单地使用

/process-name

该预期脚本将根据名称筛选进程并显示新创建的进程。它基本上是通过发送‘ o’和‘ COMMMAND = my _ program’来自动化与 top 的用户交互。类似于@nos 回答。

File: topname.exp 文件: 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 接受 like-u 的其他标志 例如:。

./topname.exp java-u 根 # 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

对于 Mac 上的任何人来说,top 不支持其他答案中显示的那种过滤(而且 pgrep 的参数有些不同) ... 这个函数将启动 top 进程,匹配第一个参数中的模式(根据 pgrep) ,以及传递给 top 的任何其他参数。

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

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

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

topnamed python

顶部附加参数的示例:

topnamed python -o mem

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