如果调用top命令,则会获得所有正在运行的进程。但是,如何仅将输出限制到某个进程名称,如“java”?
我试过这个 top -l 2 | grep java 但通过这种方式,您只能获得快照而不是持续更新的列表。并且 top -l 0 | grep java 并不是很清楚。
答案 0 :(得分:129)
我更喜欢以下内容,所以我仍然可以交互使用top,而不必在每次运行时都查看pid:
top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`
当然,如果进程发生变化,您将不得不重新运行该命令。
说明:
pgrep process-name
返回由换行符分隔的流程ID列表tr "\\n" ","
将这些新行翻译成逗号,因为top需要以逗号分隔的流程ID列表sed
是一个流编辑器,此处使用sed 's/,$//'
删除尾随逗号答案 1 :(得分:53)
找到要监控的进程的pid,然后使用-p
选项,该选项允许您为top
命令提供pid列表。
示例:
top -p 18884 -p 18892 -p 18919
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
18884 user 25 0 672M 95M 9476 S 0.0 1.1 0:02 1 java
18892 user 25 0 2280M 123M 12252 S 0.0 1.5 0:05 1 java
18919 user 22 0 1492M 198M 28708 S 0.0 2.4 0:07 1 java
(我相信你也可以传入以逗号分隔的列表。)
答案 2 :(得分:31)
top -b |怎么样? grep java
答案 3 :(得分:28)
展开@dogbane's answer,您可以获取pgrep
指定流程的所有PID来执行以下操作:
top -p "$(pgrep -d ',' java)"
答案 4 :(得分:6)
使用观看命令
watch -d 'top -n1 | grep mysql'
答案 5 :(得分:4)
使用here的答案,我能够创建一个班轮
top -pid $(pgrep process_name | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ -pid /g')
这适用于MacOS 10.12(Sierra)
答案 6 :(得分:2)
我使用以下方法解决了我的问题:
top -n1 -b | grep" proccess name"
在这种情况下: -n用于设置顶部将进行多少次处理 和-b用于显示所有pid
它可以防止以下错误: 顶部:超过pid限制(20)
答案 7 :(得分:2)
以下代码通过watch命令每5秒更新一次进程列表:
watch -n 5 -t top -b -n 1 -p$(pgrep java | head -20 | tr "\\n" "," | sed 's/,$//')
答案 8 :(得分:2)
我运行它(例如):top -b | egrep -w 'java|mysqld'
答案 9 :(得分:1)
假设..如果我们在同一名称的服务器上运行了20多个进程...这将无济于事
top -p pgrep oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'
它将尝试列出并提供20个过程的实时输出,我们很有可能错过其他消耗更多资源的过程....
我仍在寻找更好的选择
答案 10 :(得分:0)
获取进程的pid:
# pidof <process>
告诉顶部显示什么进程pid
# top -p <pid1>,<pid2>, etc
示例:
landis@linux-e6510:~>pidof konsole
1841 1709
landis@linux-e6510:~>top -p 1841,1709
顶部将仅显示2个“ konsole”过程。 这在通过ssh的繁忙服务器上很有用,而不必通过grep进行传递。
答案 11 :(得分:0)
到目前为止,这是MacOS的 only 解决方案:
top -pid `pgrep java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`
尽管如果没有invalid option or syntax: -pid
个进程处于活动状态,这将不希望地报告java
。
EXPLANATION
此处发布的其他解决方案使用格式top -p id1,id2,id3
,但是MacOS'top
仅支持笨拙的格式top -pid id1 -pid id2 -pid id3
。
因此,首先,获得具有进程名称“ java”的进程ID的列表:
pgrep java
并将其通过管道传递到awk
,后者将结果与定界符" -pid "
| awk 'ORS=" -pid "'
A,这留下了结尾的分隔符!例如,到目前为止,我们可能已经获得了字符串"123 -pid 456 -pid 789 -pid "
。
然后我们仅使用sed
来删除分隔符的最后6个字符。
| sed 's/.\{6\}$//'`
我们准备将结果传递给top
:
top -pid `...`
答案 12 :(得分:0)
只需top -bn 1 | grep java
即可为你做到这一点
答案 13 :(得分:0)
我来到这里寻找OSX的答案。我最终得到了我想要的bash和awk:
topfiltered() {
[[ -z "$1" ]] && return
dump="/tmp/top_dump"
rm -f "$dump"
while :; do
clear
[[ -s "$dump" ]] && head -n $(( $LINES - 1 )) "$dump"
top -l 1 -o cpu -ncols $(( $COLUMNS / 8 )) | awk -v p="$(pgrep -d ' ' $@)" '
BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 }
NR<=12 || ($1 in pids)
' >"$dump"
done
}
我在日志记录模式下循环并使用awk过滤它,从pgrep的输出构建一个关联数组。 Awk打印前12行,其中第12行是列标题,然后是每行都有一个pid,它是数组中的键。转储文件用于更加可观察的循环。
答案 14 :(得分:0)
运行以下内容将在控制台中持续更新:
bcsmc2rtese001 [~]$ echo $SHELL
/bin/bash
bcsmc2rtese001 [~]$ top | grep efare or watch -d 'top | grep efare' or top -p pid
27728 efare 15 0 75184 3180 1124 S 0.3 0.0 728:28.93 tclsh
27728 efare 15 0 75184 3180 1124 S 0.7 0.0 728:28.95 tclsh
答案 15 :(得分:0)
一个更具体的案例,就像我实际上在寻找:
对于 Java进程,您还可以使用jps -q
,其中 jps 是来自 $ JAVA_HOME / bin 的工具,因此应该是在你的$ PATH。
答案 16 :(得分:-1)
使用Rick Byers答案中提到的方法:
top -p `pgrep java | paste -sd "," -`
但是我运行了20多个进程,因此对于遇到类似情况的人来说,以下命令可能会有所帮助。
top -p `pgrep java | head -n 20 | paste -sd "," -`
pgrep
获取具有给定名称的进程列表 - 在本例中为java。 head
用于获取前20个pid,因为使用-p参数时top不能处理超过20个pid。最后paste
使用','。
您可以在上面的命令中控制您要查找的进程名称,以及您有兴趣观看的具有该名称的进程数。如果具有给定名称的进程数小于20,则可以忽略head -n 20
部分。