Linux Top命令,包含20多个命令

时间:2014-08-14 19:19:39

标签: linux bash top-command

我想使用top来按流程名称监控多个流程。我已经知道做$ top -p $(pgrep -d ',' <pattern>),但top只限制了20个pid。有没有办法允许20多个pid?

我是否必须使用pswatch的组合来获得类似的结果?

2 个答案:

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

另一种解决方法可能是使用tmuxscreen以及多个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