如果调用top命令,则将获得所有正在运行的进程。但是如何将输出仅限制为某个特定的进程名称(如“ java”)?
我已经尝试过这个 顶级-l 2 | grep java, 但是通过这种方式,您只能获取快照,而不能获取持续更新的列表。和顶部-l 0 | grep java不是很清楚。
如果调用top命令,则将获得所有正在运行的进程。但是如何将输出仅限制为某个特定的进程名称(如“ java”)?
我已经尝试过这个 顶级-l 2 | grep java, 但是通过这种方式,您只能获取快照,而不能获取持续更新的列表。和顶部-l 0 | grep java不是很清楚。
Answers:
我更喜欢以下内容,因此我仍然可以交互使用top,而不必每次运行时都查找pid:
top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`
当然,如果流程更改,则必须重新运行该命令。
说明:
pgrep process-name
返回由换行符分隔的进程ID的列表tr "\\n" ","
将这些换行符转换为逗号,因为top希望以逗号分隔的进程ID列表sed
是流编辑器,sed 's/,$//'
在此处用于删除尾部逗号top: pid limit (20) exceeded
。反正那个限制附近有吗?
top -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//')
。这将显示最多返回前20个PID的数据pgrep
。
-pid
是-p
。
找到要监视的进程的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
(我相信您也可以传递以逗号分隔的列表。)
top -b怎么样?grep Java
使用watch命令
watch -d 'top -n1 | grep mysql'
man watch
“ watch反复运行命令,显示其输出和错误”;它不显示当前运行的进程就像top
做
watch -d 'top -b -n1 | grep mysql'
我运行它(例如): top -b | egrep -w 'java|mysqld'
我来到这里是在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是数组中的键。转储文件用于更易于观察的循环。
运行以下命令将在控制台中进行连续更新:
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
这是迄今为止针对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 `...`
使用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,则可以忽略该部分。