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

如果您调用top命令,则会获得所有正在运行的进程。 但是,我怎样才能限制输出到一个特定的进程名称,如“java”

我试过这个顶部-l 2 | grep java,但这样你只能得到快照而不是连续更新的列表。 和top -l 0 | grep java不是很清楚。

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

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

当然,如果stream程发生变化,您将不得不重新运行该命令。

说明:

  • pgrep process-name返回由换行符分隔的进程ID列表
  • tr "\\n" ","将这些换行符翻译成逗号,因为top需要逗号分隔的进程ID列表
  • sed是一个stream编辑器, sed 's/,$//'用于删除尾部的逗号

find要监视的进程的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 

(我相信你也可以通过一个逗号分隔的列表。)

顶部怎么样? grep java

在@ dogbane的答案上进行扩展,您可以使用pgrep获取指定进程的所有PID,以执行以下操作:

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

使用watch命令

 watch -d 'top -n1 | grep mysql' 

我运行它(例如): top -b | egrep -w 'java|mysqld' top -b | egrep -w 'java|mysqld'

我解决了我的问题:

顶部-n1 -b | grep“进程名称”

在这种情况下:-n用于设置top将执行多less次
-b用于显示所有的pid

它可以防止如下错误:top:超过了pid limit(20)

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

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

使用从这里的答案,我能够创build一个class轮

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

这适用于MacOS 10.12(Sierra)

假设,如果我们有超过20个进程在同名的服务器上运行,这将无济于事

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

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

我仍然在寻找更好的select

一个更具体的例子,就像我实际上正在寻找的:

对于Java进程,您还可以使用jps -q ,其中jps$ JAVA_HOME / bin中的工具,因此应该位于$ PATH中。

我来到这里寻找在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 -vp="$(pgrep -d ' ' $@)" ' BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 } NR<=12 || ($1 in pids) ' >"$dump" done } 

我在日志模式下循环顶部,并用awk过滤,从pgrep的输出build立一个关联数组。 Awk打印前12行,其中第12行是列标题,然后每行都有一个pid,这是数组中的一个键。 转储文件用于一个更可观察的循环。

只是top -bn 1 | grep java top -bn 1 | grep java会为你做诡计

运行下面的命令可以在控制台中进行连续更新

 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