将TOP命令的输出限制为特定的进程名称

时间:2010-09-16 14:42:54

标签: macos unix command-line top-command

如果调用top命令,则会获得所有正在运行的进程。但是,如何仅将输出限制到某个进程名称,如“java”

我试过这个   top -l 2 | grep java 但通过这种方式,您只能获得快照而不是持续更新的列表。并且 top -l 0 | grep java 并不是很清楚。

17 个答案:

答案 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使用','。

加入pid列表

您可以在上面的命令中控制您要查找的进程名称,以及您有兴趣观看的具有该名称的进程数。如果具有给定名称的进程数小于20,则可以忽略head -n 20部分。