You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于/proc文件仅显示Sleeping(S)状态进程?求助实现方法

筛选/proc中处于Sleeping(S)状态的进程

我来帮你搞定这个问题!之前用egrep没达到效果,大概率是因为你没遍历/proc下每个进程独立的status文件——毕竟每个运行的进程在/proc下都有一个以PID命名的目录,里面的status才是存储该进程状态的地方,而非一个统一的/proc/status文件(系统根目录下的/proc/status是整个系统的状态信息,不是单个进程的)。

下面给你两个实用的实现方案,都是基于bash脚本的,你可以直接用:

方案一:用bash循环遍历PID目录

这个方案逻辑清晰,容易修改扩展:

# 遍历/proc下所有数字命名的目录(即进程PID目录)
for pid_dir in /proc/[0-9]*; do
    # 检查当前进程的状态是否为Sleeping(S)
    if grep -q "^State:\s*S" "$pid_dir/status"; then
        # 提取进程名称
        proc_name=$(grep "^Name:" "$pid_dir/status" | awk '{print $2}')
        # 输出PID和进程名,你可以根据需求修改输出内容
        echo "PID: ${pid_dir##*/} | 进程名: $proc_name"
    fi
done

细节解释:

  • /proc/[0-9]* 匹配所有以数字开头的/proc子目录,也就是各个进程的PID目录
  • grep -q "^State:\s*S" 静默检查status文件中State:行是否以S开头(\s*匹配任意数量的空格,避免不同进程状态行的格式差异)
  • ${pid_dir##*/} 是bash的参数扩展,用来提取PID目录的最后部分(即纯PID号)
  • 如果需要查看该进程的完整status信息,把echo那行换成cat "$pid_dir/status"即可

方案二:用find命令实现更简洁的写法

如果喜欢更紧凑的命令,可以用find配合管道:

find /proc -maxdepth 1 -type d -regex '/proc/[0-9]+' | while read pid_dir; do
    grep -q "^State:\s*S" "$pid_dir/status" && echo "$(basename "$pid_dir"): $(grep "^Name:" "$pid_dir/status" | cut -d' ' -f2-)"
done

细节解释:

  • find命令只搜索/proc下一级的目录(-maxdepth 1),且只匹配数字命名的目录(-regex '/proc/[0-9]+')
  • basename "$pid_dir" 同样用来提取纯PID号
  • cut -d' ' -f2- 用来提取进程名(比awk更简洁,适合字段固定的场景)

如果需要筛选除了可中断睡眠(S)之外的其他睡眠状态(比如不可中断睡眠D),只需要把S换成对应的状态字符就行。

内容的提问来源于stack exchange,提问作者user08

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:02:15