查找所有拥有超过 N 个进程的用户并在 shell 中回显它们

Ale*_*ern 5 linux shell ksh ps array

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

我知道我应该使用ps -elf,但是如何解析它,找到具有 >N 个进程的用户,并用它们创建一个数组?我在 ksh 中遇到了数组问题。也许一个简单的解决方案可以帮助我,而不必创建一个数组。一个人推荐我使用

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

但它不能正常工作。

Mat*_*Mat 11

您应该将列输出减少ps到最少,即在此处仅请求用户名 - 这简化了进一步的处理。

例如:

$ ps -eo user=
Run Code Online (Sandbox Code Playgroud)

将打印所有当前正在运行的进程的所有者(=抑制标题)。

获取每个用户的计数的简单方法:

$ ps -eo user= | sort | uniq -c
  1 dovecot
  1 messagebus
  1 mpd
  1 polkitd
  2 postfix
121 root
 27 me
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据需要对其进行过滤:

$ ps -eo user= | sort | uniq -c | awk '$1 > 42 {print $2}'
root
Run Code Online (Sandbox Code Playgroud)

在变量中有限制:

$ N=42
$ ps -eo user= | sort | uniq -c | awk -v limit="$N" '$1 > limit {print $2}'
root
Run Code Online (Sandbox Code Playgroud)