我想要使用top
来监视进程名称的大量进程。 我已经知道做$ top -p $(pgrep -d ',' <pattern>)
但是top
只限制了20个pid。 有没有办法让20多个pid?
我是否必须使用ps
和watch
的组合来获得类似的结果?
从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个二进制文件。
与手表包装。 经过了Ubuntu 11.04,Ubuntu 14.04,RHEL5,RHEL6和RHEL7的测试
语法: script.sh pid [ pid ...]
#空格分隔
例如: script.sh $(pgrep -d ' ' <pattern>)
#!/斌/庆典 我= 10#〜间隔秒 格式() { 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 // /,}” } 主要() { 格式$ @ top -b -n 1 -p $ a [$#-gt 20] && shift 20 || 班$# 直到[$#-eq 0]; 做 格式$ @ top -b -n 1 -p $ a | sed'1,/ PID / d; / ^ $ / d' [$#-gt 20] && shift 20 || 班$# DONE } 如果[“$ 1”==“watch”]; 然后 转移 shopt -s extglob 主要$ @ 其他 看-t -n $ i“$ 0 watch $ @” 科幻