0

我写的脚本是ksh。需要找到所有拥有超过 N 个进程的用户并在 shell 中回显它们。N 从 ksh 读取。

我知道我应该使用什么ps -elf,但是如何解析它,找到具有 >N 进程的用户并用他们创建数组。ksh 中数组的小麻烦。请帮忙。也许简单的解决方案可以帮助我而不是创建数组。

s162103@helios:/home/s162103$ ps -elf 
     0 S  s153308  4804     1   0  40 20        ?  17666        ? 11:03:08 ?           0:00 /usr/lib/gnome-settings-daemon --oa
     0 S     root  6546  1327   0  40 20        ?   3584        ? 11:14:06 ?           0:00 /usr/dt/bin/dtlogin -daemon -udpPor
     0 S webservd 15646   485   0  40 20        ?   2823        ?     п╪п╟я─я ?           0:23 /opt/csw/sbin/nginx
     0 S  s153246  6746  6741   0  40 20        ?  18103        ? 11:14:21 ?           0:00 iiim-panel --disable-crash-dialog
     0 S  s153246 23512     1   0  40 20        ?  17903        ? 09:34:08 ?           0:00 /usr/bin/metacity --sm-client-id=de
     0 S     root   933   861   0  40 20        ?   5234        ? 10:26:59 ?           0:00 dtgreet -display :14
     ...

当我输入

ps -elf | awk '{a[$3]++;}END{for(i in a)if (a[i]>N)print i, a[i];}' N=1

s162103@helios:/home/s162103$ ps -elf | awk '{a[$3]++;}END{for(i in a)if (a[i]>N)print i, a[i];}' N=1
root 118
/usr/sadm/lib/smc/bin/smcboot 3
/usr/lib/autofs/automountd 2
/opt/SUNWut/lib/utsessiond 2
nasty 31
dima 22
/opt/oracle/product/Oracle_WT1/ohs/ 7
/usr/lib/ssh/sshd 5
/usr/bin/bash 11

那不是用户 /usr/sadm/lib/smc/bin/smcboot 有最后一个字段 ps -elf ,不是用户

4

3 回答 3

1

像这样的东西(假设你的 ps 命令的第三个字段给出了用户 ID):

 ps -elf | 
   awk '{a[$3]++;}
   END {
     for(i in a)
       if (a[i]>N)
         print i, a[i];
   }' N=3
于 2013-03-19T04:31:14.053 回答
0
read number    
ps -elfo user= | sort | uniq -c | while read count user
do 
    if (( $count > $number )) 
    then 
      echo $user  
    fi  
done

这是最好的解决方案,它的工作原理!

于 2013-03-19T15:04:16.200 回答
0

ps您要在此处使用的最小命令是ps -eo user=. 这只会打印每个进程的用户名,仅此而已。其余的可以用 awk 完成:

ps -eo user= |
  awk  -v max=3 '{ n[$1]++ }
    END {
      for (user in n)
        if (n[user]>max)
          print n[user], user
  }'

为了便于阅读,我建议将计数放在第一列。

于 2013-03-19T21:28:47.107 回答