我如何计算系统中睡眠进程的数量?

我如何计算系统中睡眠进程的数量?

如何使用 shell 脚本计算休眠进程的数量?

答案1

扩展解释...相信你会全部吸收,因为这是你的家庭作业......

ps使用命令列出进程

$ ps
  PID TTY          TIME CMD
 4879 pts/3    00:00:00 bash
 5003 pts/3    00:00:00 ps

哦,这只显示当前会话的进程。我们想显示系统中的所有进程。为此,我们可以使用-e标志

$ ps -e
  PID TTY          TIME CMD
    1 ?        00:00:05 systemd
    2 ?        00:00:00 kthreadd
    3 ?        00:00:00 ksoftirqd/0
[and many more lines]

但是我们如何显示哪些正在睡觉呢?

您可以使用-l选项或u选项。这将提供更多详细信息,包括进程的状态。休眠进程在 STAT 列中有一个字母SD

man ps

进程状态代码这里是 s、stat 和 state 输出说明符(标题“STAT”或“S”)将显示用于描述进程状态的不同值:

           D    uninterruptible sleep (usually IO)
           R    running or runnable (on run queue)
           S    interruptible sleep (waiting for an event to complete)
           T    stopped by job control signal
           t    stopped by debugger during the tracing
           W    paging (not valid since the 2.6.xx kernel)
           X    dead (should never be seen)
           Z    defunct ("zombie") process, terminated but not reaped by its parent

我们可以格式化ps输出以仅显示状态,以便更容易地计算它们:

ps -e -o state

这里我们使用-e获取所有进程和-o标志,后面跟着我们想要的输出类型。此命令仅输出状态字母。然后我们可以将此|输出通过管道传输(使用)到或来计算休眠进程的grep行数:SD

ps -e -o state | grep -cE 'S|D'

grep搜索文本。该-c选项告诉它只计算匹配项,而不是输出找到的文本本身。该-E选项告诉它grep使用扩展正则表达式,以便我们可以使用字符|来匹配事物或使用表达式的东西:thing|stuff。使用正则表达式时,使用单引号以防止 shell 扩展。

答案2

如果您知道该ps命令输出睡眠进程的状态为可S中断睡眠和D不可中断睡眠,并且可以使用-o s标志来查找这些状态,那么这非常简单。现在您要做的就是运行输出,grep它将计算这些标志的出现次数。如下所示:

$ ps -e -o s | grep -o 'S\|D' -c                                                                                         
260

答案3

另一种方法是使用以下命令列出每个状态下的进程数:

$ ps -e -o state | sort | uniq -c
  1 R
141 S

答案4

top实用程序提供任务数,显示正在运行的任务数和休眠的任务数。当然,这些任务数会随时变化,但这些单行命令的输出也会随时变化。与任何 *nix 实用程序一样,该页面man将提供更详细的信息。

相关内容