我想使用top
来按流程名称监控多个流程。我已经知道做$ top -p $(pgrep -d ',' <pattern>)
,但top
只限制了20个pid。有没有办法允许20多个pid?
我是否必须使用ps
和watch
的组合来获得类似的结果?
答案 0 :(得分:5)
来自top/top.c
:
if (Monpidsidx >= MONPIDMAX)
error_exit(fmtmk(N_fmt(LIMIT_exceed_fmt), MONPIDMAX));
(其中LIMIT_exceed_fmt
是您收到的错误消息。)
在top/top.h
:
#define MONPIDMAX 20
我将此数字更改为80,这似乎工作正常。不确定为什么这个硬编码限制如此之低。
因此,如果手动编译procps-ng是一个选项,那么你可以这样做。您不需要更换系统顶部(或需要root权限),您可以将它放在homedir中。
另一种解决方法可能是使用tmux
或screen
以及多个top
个实例。
另一个可能的解决方案可能是使用带有循环的ps
,即
#!/bin/sh
while :; do
clear
ps $*
sleep 1
done
将其调用为:./psloop.sh 42 666
您可能需要向ps
添加更多标记以获取其他信息。还要注意这个效率较低,因为它每秒会调用3个二进制文件。
答案 1 :(得分:2)
带手表的包装纸。使用Ubuntu 11.04,Ubuntu 14.04,RHEL5,RHEL6和RHEL7进行测试
语法:script.sh pid [ pid ...]
#space分隔
script.sh $(pgrep -d ' ' <pattern>)
#!/bin/bash i=10 # ~ interval in seconds format() { a="$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12}" a="$a ${13} ${14} ${15} ${16} ${17} ${18} ${19} ${20}" a="${a%%*( )}"; a="${a// /,}" } main() { format $@ top -b -n 1 -p $a [ $# -gt 20 ] && shift 20 || shift $# until [ $# -eq 0 ]; do format $@ top -b -n 1 -p $a | sed '1,/PID/d;/^$/d' [ $# -gt 20 ] && shift 20 || shift $# done } if [ "$1" == "watch" ]; then shift shopt -s extglob main $@ else watch -t -n $i "$0 watch $@" fi