如何基于/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
相关产品推荐
相关产品推荐

