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

aeo*_*ani 7 command-line scripts process

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

Zan*_*nna 8

扩展解释......相信你会接受它,因为这是你的家庭作业......

使用ps命令列出进程

$ ps
  PID TTY          TIME CMD
 4879 pts/3    00:00:00 bash
 5003 pts/3    00:00:00 ps
Run Code Online (Sandbox Code Playgroud)

哦,这只是显示当前会话的进程。我们想显示系统中的所有进程。为此,我们可以使用-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]
Run Code Online (Sandbox Code Playgroud)

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

您可以使用-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
Run Code Online (Sandbox Code Playgroud)

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

ps -e -o state
Run Code Online (Sandbox Code Playgroud)

这里我们-e用来获取所有进程和-o标志,然后是我们想要的输出类型。此命令仅输出状态字母。然后我们可以通过管道(使用|)这个输出grep来计算带有S或的行D,睡眠进程:

ps -e -o state | grep -cE 'S|D'
Run Code Online (Sandbox Code Playgroud)

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

  • 管道右侧的另一个选项是`grep -c '[SD]'`。(每个选项都只是一个字符,所以一个字符类就足够了。) (2认同)

Ser*_*nyy 5

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

$ ps -e -o s | grep -o 'S\|D' -c                                                                                         
260
Run Code Online (Sandbox Code Playgroud)