可通过ps命令的stat列识别进程睡眠状态:s为可中断睡眠,d为不可中断睡眠;/proc/[pid]/stat第3字段亦对应此状态,s或d即表示睡眠。

可以通过 ps 命令查看进程状态字段(STAT 或 S 列),直接识别是否处于睡眠状态。
看 ps 输出中的状态码
运行 ps aux 或 ps -eo pid,comm,state,stime,重点关注 STATE(或 STAT)列:
- S:表示可中断睡眠(interruptible sleep),即常规的“睡眠状态”,进程在等待事件(如 I/O、信号、定时器);
- D:表示不可中断睡眠(uninterruptible sleep),通常在等待底层硬件操作完成(如磁盘 I/O),此时不响应任何信号;
- R 状态不是睡眠,T/Z 等也与睡眠无关,需排除。
用 pgrep 或 ps 配合筛选
快速找出所有睡眠中进程:
-
ps -eo pid,comm,state | awk '$3 ~ /^[SD]$/ {print}'—— 打印所有 S 或 D 状态的进程; -
pgrep -s 0 -f "." | xargs -r ps -o pid,comm,state -p配合过滤更精准; - 想查某个进程名是否睡了:
ps -C nginx -o pid,comm,state,看 state 是否为 S 或 D。
结合 /proc 文件系统验证
每个进程在 /proc/[pid]/stat 中第3个字段是状态字符:
-
cat /proc/1234/stat | cut -d' ' -f3—— 若输出 S 或 D,即为睡眠; - 该字段值严格对应内核定义:
S是 TASK_INTERRUPTIBLE,D是 TASK_UNINTERRUPTIBLE; - 注意:该文件内容无空格分隔符干扰,字段位置固定,适合脚本解析。
观察行为辅助判断
状态码只是快照,还需结合上下文确认是否真在“等”:
- S 状态进程通常能被
kill -CONT或信号唤醒(比如等待用户输入的read()); - D 状态进程无法被 kill 杀死,
kill -9也无效,直到它等待的 I/O 完成; - 长时间卡在 D 状态,可能意味着磁盘故障或驱动异常,需检查
dmesg日志。











