将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