3

我想使用top以通过进程名称监视众多进程。我已经知道这样做$ top -p $(pgrep -d ',' <pattern>),但top只限制我 20 个 pid。有没有办法允许超过 20 个 pid?

我必须使用ps和的组合watch来获得相似的结果吗?

4

2 回答 2

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中。

另一种解决方法可能是使用tmuxorscreen和多个top实例。

另一种可能的解决方案可能是使用ps循环,即。

#!/bin/sh

while :; do
    clear
    ps $*
    sleep 1
done

调用它:./psloop.sh 42 666

您可能需要添加更多标志以ps获取更多信息。另请注意,这效率较低,因为它每秒会调用 3 个二进制文件。

于 2014-08-14T19:30:07.887 回答
2

带手表的包装纸。使用 Ubuntu 11.04、Ubuntu 14.04、RHEL5、RHEL6 和 RHEL7 测试

语法:script.sh pid [ pid ...] #空格分隔


例子:script.sh $(pgrep -d ' ' <pattern>)


#!/bin/bash

i=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// /,}"
}

主要的()
{
  格式 $@
  顶部 -b -n 1 -p $a
  [ $# -gt 20 ] && 移位 20 || 转移$#

  直到 [ $# -eq 0 ]; 做
    格式 $@
    顶部 -b -n 1 -p $a | sed '1,/PID/d;/^$/d'
    [ $# -gt 20 ] && 移位 20 || 转移$#
  完毕
}

如果 [ "$1" == "手表" ]; 然后
  转移
  shopt -s extglob
  主要$@
别的
  观看 -t -n $i "$0 观看 $@"
菲
于 2014-08-14T23:16:16.310 回答