Linux 进程“卡死”通常不是真的“死掉”,而是处于某种不可中断或等待状态。下面按最常见原因由浅入深解释,并给出排查思路。
用 ps 或 top 看进程状态(STAT 列):
ps -eo pid,stat,cmd
常见状态含义:
| 状态 | 含义 |
|---|---|
| R | 正在运行或在运行队列 |
| S | 可中断睡眠(等事件,如 socket、sleep) |
| D | 不可中断睡眠(通常卡死在这里) |
| Z | 僵尸进程 |
| T | 被暂停(如 Ctrl+Z) |
| I | 空闲内核线程 |
✅ 90% 的“卡死”都是 D 状态
表现
D典型场景
排查
dmesg | tail -n 50
iostat -x 1
结论
进程在等内核 I/O 返回,内核不允许中断,所以卡死
表现
futex、mutex、rwlock排查
pstack <pid>
strace -p <pid>
常见原因
表现
kswapd 很高排查
free -h
vmstat 1
dmesg | grep -i oom
注意
内存不足时,进程可能卡在 page fault,看起来像“假死”
表现
排查
dmesg
uname -a
表现
Z原因
wait()解决
表现
T解决
kill -CONT <pid>
ps -eo pid,stat,cmd | grep <进程名>
dmesg -T | tail -n 100
journalctl -xe
cat /proc/<pid>/wchan
cat /proc/<pid>/stack
top
iostat -x 1
vmstat 1
kill -9 没用
原因:
✅ 只能等 I/O 返回或重启系统
Linux 进程卡死,90% 是“等 I/O 或锁”,不是真的死。
如果你愿意,可以把下面信息发我,我可以帮你精准判断:
ps -eo pid,stat,cmddmesg 最后几行我可以直接告诉你“该不该重启”。