“Linux 进程卡死”是一个很常见的现象,但通常不是某一个单一原因,而是某一类问题导致的。下面我从常见原因 → 如何判断 → 如何处理三个层次来讲。
在 Linux 中,进程“卡死”一般表现为:
top 里状态是 D(不可中断睡眠)kill -9 也杀不掉⚠️ 注意:kill -9 杀不掉的进程,往往已经不是“普通卡死”了
最常见、最危险
ps -eo pid,stat,comm | grep D
常见原因:
✅ 特点:
kill -9 无效多线程程序中非常常见
原因:
表现:
例如:
read() 没数据accept() 没连接connect() 网络不通常见于:
检查:
ulimit -a
lsof -p <pid>
非常典型
表现:
ls 某个目录卡住ps -eo pid,stat,comm
Z✅ 不能 kill,只能:
ps -p <pid> -o pid,stat,wchan:30,cmd
D → I/OS → 睡眠(正常)R → 运行中Z → 僵尸cat /proc/<pid>/wchan
cat /proc/<pid>/stack
strace -p <pid>
你会看到:
futexreadnanosleepperf top -p <pid>
| 场景 | 建议 |
|---|---|
| D 状态 + NFS | 断开挂载 / 重启 |
| 多线程死锁 | 看栈、加日志 |
| 网络阻塞 | 设 timeout |
| 僵尸进程 | 杀父进程 |
| 内核卡死 | dmesg / 重启 |
Linux 进程卡死,90% 是“等某样东西等不到”
—— 等 I/O、等锁、等网络、等父进程
如果你愿意,可以把下面信息发我,我可以帮你精准判断:
ps 状态strace 输出我可以直接帮你定位是哪一类问题。