如何使用 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 列中有一个字母S
或D
从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
行数:S
D
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
将提供更详细的信息。