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


81

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

我已经尝试过这个 顶级-l 2 | grep java, 但是通过这种方式,您只能获取快照,而不能获取持续更新的列表。和顶部-l 0 | grep java不是很清楚。


5
不幸的是,到目前为止,仍然没有有效的答案,因为OS X的top命令不支持-p和-b 。
Alex

我已经在下面发布了第一个OSX解决方案-只是在很短的时间;)
Anti Earth

Answers:


131

我更喜欢以下内容,因此我仍然可以交互使用top,而不必每次运行时都查找pid:

top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`

当然,如果流程更改,则必须重新运行该命令。

说明:

  • pgrep process-name 返回由换行符分隔的进程ID的列表
  • tr "\\n" "," 将这些换行符转换为逗号,因为top希望以逗号分隔的进程ID列表
  • sed是流编辑器,sed 's/,$//'在此处用于删除尾部逗号

2
最佳答案,是对狗狗的改进,因此您可以实际键入名称,而不是粘贴大量的PID。(这就是SO)
萨布根顿

1
如果可以的话,我会多次投票赞成您,我认为这应该是“可接受的”答案。
spuriousdata

6
我正在top: pid limit (20) exceeded。反正那个限制附近有吗?
celwell,2013年

7
@celwell,请尝试top -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//')。这将显示最多返回前20个PID的数据pgrep
Acumenus

3
从优胜美地(或更早吗?)开始,它-pid-p
最高

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

(我相信您也可以传递以逗号分隔的列表。)


7
在Mac上,它应该是“ top -pid ID”,但是Java进程可能有几个不同的ID,因为可能有多个Java进程。
亚历克斯(Alex)2010年


29

扩展@dogbane的答案,您可以通过pgrep执行以下操作获取命名进程的所有PID :

top -p "$(pgrep -d ',' java)"

2
最高限制为20 pid
mrP

top -p "$(pgrep -d ',' php)" top: pid limit (20) exceeded
mrP

你是对的!man top说:“此选项最多可以给出20次,或者您可以提供一个以逗号分隔的列表,最多包含20个PID。” 哎呀
l0b0

6

使用watch命令

watch -d 'top -n1 | grep mysql'

应该是“ watch --d”。但是我没有输出执行此命令。
亚历克斯(Alex)2010年

-1 ::man watchwatch反复运行命令,显示其输出和错误”;它不显示当前运行的进程就像top
sdaau

@AlexanderOrlov,这里没有特殊的魔术,只需使用top -n1打印并退出,然后使用watch对其进行连续监视。
tszming 2013年

@sdaau,您的评论与我的回答无关,请在下次再次进行仔细的答复。
tszming

1
我认为我们应该添加-b选项。watch -d 'top -b -n1 | grep mysql'
雷耶斯·杨

6

使用这里的答案,我能够创建一个衬板

top -pid $(pgrep process_name | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ -pid /g')

这对我适用于MacOS 10.12(Sierra)


2

我使用以下方法解决了我的问题:

top -n1 -b | grep“过程名称”

在这种情况下:-n用于设置top将处理多少次
,-b用于显示所有pid

它可以防止出现以下错误:顶部:超出pid限制(20)


2

以下代码通过watch命令每5秒更新一次进程列表:

watch -n 5 -t top -b -n 1 -p$(pgrep java | head -20 | tr "\\n" "," | sed 's/,$//')



1

假设..如果我们在服务器上运行了20个同名进程,这将无济于事。

顶-p pgrep oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'

它将尝试列出并提供20个过程的实时输出,其中我们很可能会错过消耗更多资源的其他过程....

我仍然在寻找更好的选择


0

一个更具体的情况,例如我实际上正在寻找的情况:

对于Java进程,你也可以使用jps -q,其中JPS是从工具$ JAVA_HOME / bin中,因此应该在你的$ PATH。


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
}

我在日志记录模式下循环运行top,并使用awk对其进行过滤,从而从pgrep的输出中构建了一个关联数组。Awk打印前12行,其中第12行是列标题,然后打印包含pid的每一行,而pid是数组中的键。转储文件用于更易于观察的循环。


在OSX上,您可以使用pgrep <process_name>之类的东西;top -pid <pid_specified_by_pgrep>
bergercookie '16

0

只是top -bn 1 | grep java会做的伎俩为你


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

0

这是迄今为止针对MacOS的唯一解决方案:

top -pid `pgrep java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`

尽管这将不希望地报告invalid option or syntax: -pid是否没有活动的java进程。

说明

这里发布的其他解决方案使用该格式top -p id1,id2,id3,但是MacOStop仅支持笨拙的格式top -pid id1 -pid id2 -pid id3

因此,首先,我们获得具有进程名称“ java”的进程ID的列表:

pgrep java

然后我们用管道将awk其与定界符连接起来" -pid "

| awk 'ORS=" -pid "'

las,这留下了结尾的分隔符!例如,到目前为止,我们可能已经获得了string "123 -pid 456 -pid 789 -pid "

然后,我们仅使用sed去除定界符的最后6个字符。

| sed 's/.\{6\}$//'`

我们准备将结果传递给top

top -pid `...`

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传递。


抱歉,没有看到有问题的macos标签。我的工作在我所有的Linux机器上。
兰迪斯·里德

-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列表。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.