一文详解Linux如何关闭关不掉的进程

 更新时间:2026年06月08日 08:21:46   作者:detayun  
你一定遇到过这种情况:kill -9 都杀不死,进程像钉子一样扎在系统里,这篇文章通过代码示例讲清楚原因和所有能用的手段,需要的朋友可以参考下

你一定遇到过这种情况:kill -9 都杀不死,进程像钉子一样扎在系统里。这篇文章讲清楚原因和所有能用的手段。

一、先搞清楚:为什么关不掉?

不是所有"关不掉"都是同一种情况。用 ps aux | grep 进程名 看一眼 STAT 列:

状态含义能否被杀死
R运行中✅ 正常杀
S可中断睡眠✅ kill -9 可杀
D不可中断睡眠kill -9 无效
Z僵尸进程❌ 已死,只是没人收尸
T被调试暂停✅ 杀掉调试器即可

最常见的两种"杀不死"

  1. D 状态:进程在等 I/O(读写磁盘/网络),内核不允许被信号打断
  2. Z 状态:进程已退出,但父进程没调用 wait(),它就一直挂在进程表里

二、按场景逐个击破

场景 1:kill -9 无效(D 状态)

这是最棘手的。进程卡在内核态,信号根本送不进去。

手段一:找到它在等什么,然后解决根源

# 查看进程在等什么文件/设备
lsof -p <PID>
# 或者
cat /proc/<PID>/stack

如果是在等 NFS 挂载点,那就去恢复 NFS 连接;如果是在等磁盘 I/O,检查磁盘是否故障。

手段二:强制卸载文件系统

如果进程卡在某个挂载点上:

umount -f -l /mnt/problem   # 懒卸载,立刻解除挂载

-l(lazy):立刻把挂载点从文件系统层级中移除,等进程释放后再真正清理。

手段三:重启系统(兜底)

实在没办法,这是唯一 100% 有效的方式。

reboot -f    # 强制重启,不走正常关机流程

场景 2:僵尸进程(Z 状态)

僵尸进程已经死了,kill 对它没有任何意义——你杀不死一个已经死了的东西

正确做法:杀它的父进程,让 init(PID 1)接管并回收。

ps -o ppid= -p <僵尸PID>    # 查父进程 PID
kill -9 <父进程PID>          # 杀父进程

杀完之后僵尸进程会自动消失。

如果父进程是 init(PPID=1),说明 init 没来得及回收。这种情况:

  • 少量僵尸:不用管,系统会自动清理
  • 大量僵尸:说明父进程有 bug,需要修复程序本身

场景 3:进程被保护(PID 1 / systemd 子女)

有些进程的父进程是 1 号进程(systemd),你杀它,systemd 会立刻重启。

# 查看父进程
pstree -p <PID>

正确做法:让 systemd 来管

systemctl stop <服务名>       # 正常停止
systemctl disable <服务名>    # 禁止开机自启
systemctl mask <服务名>       # 彻底屏蔽,连手动启动都不行

场景 4:内核线程(名字带 [])

[kworker/0:1]  [migration/0]  [ksoftirqd/0]

这些不是用户进程,是内核线程,不能杀,也不该杀。杀了会导致内核 panic。

如果你看到某个内核线程 CPU 占用异常高,那是内核 bug 或驱动问题,需要排查内核日志:

dmesg | tail -50

三、一张表总结所有手段

情况首选方案备选方案终极方案
D 状态(等 I/O)找原因,解决 I/O 阻塞umount -f -lreboot -f
Z 状态(僵尸)kill 父进程等系统自动回收
被 systemd 保护systemctl stop/mask
内核线程不要动dmesg
普通进程kill -9pkill -9reboot -f

四、一个真实案例

某天服务器上一个 Java 进程卡死,kill -9 无反应:

$ ps aux | grep java
root  12345  99.0  ...  D  ...

$ lsof -p 12345
java  12345 root  3r  REG  8,1  ...  /mnt/nfs/data/app.log (deleted)

真相:进程在往一个已经被删除的 NFS 文件写日志,NFS 服务器已断连,进程卡在 D 状态。

解决

umount -f -l /mnt/nfs    # 懒卸载 NFS
# 2 秒后,进程自动退出

没有重启,没有数据丢失,30 秒解决。

写在最后

"关不掉的进程"本质上不是进程的问题,是它在等的那个东西出了问题。

kill -9 是最后的手段,不是第一反应。先看状态,再看它在等什么,绝大多数情况根本不需要重启。

以上就是一文详解Linux如何关闭关不掉的进程的详细内容,更多关于Linux关闭关不掉的进程的资料请关注脚本之家其它相关文章!

相关文章

  • linux实现自动删除最旧的几个文件详解

    linux实现自动删除最旧的几个文件详解

    最近因为工作的原因,有需求要删除Linux中旧的压缩包,发现网上给的答案都是删除N天前的文件,无法适应我的要求,于是自己研究了一翻。所以下面这篇文章主要介绍了关于linux自动删除最旧的几个文件的相关资料,需要的朋友可以参考下。
    2017-09-09
  • 有效学习Linux系统的4个方法

    有效学习Linux系统的4个方法

    这篇文章主要为大家详细介绍了有效学习Linux系统的4个方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Linux netstat命令安装方式

    Linux netstat命令安装方式

    这篇文章主要介绍了Linux netstat命令安装方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Linux 系统下安装JDK1.8的教程详解

    Linux 系统下安装JDK1.8的教程详解

    这篇文章主要介绍了Linux 系统下安装JDK1.8的教程详解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • Windows系统下Apache服务器无法启动的问题解决

    Windows系统下Apache服务器无法启动的问题解决

    这篇文章主要介绍了Windows系统下Apache服务器无法启动的问题解决,大多数情况下还是端口被占用的问题,需要的朋友可以参考下
    2015-07-07
  • Ubuntu下Telnet服务器的配置方法

    Ubuntu下Telnet服务器的配置方法

    这篇文章主要介绍了Ubuntu下Telnet服务器的配置方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • linux下PAC正向代理某个网址上网方式

    linux下PAC正向代理某个网址上网方式

    文章描述了在私有化场景下部署Kubernetes服务,并通过内部代理服务器访问互联网的解决方案,通过创建一个PAC文件的Pod,文章展示了如何配置环境变量并验证代理服务器是否正常工作
    2026-03-03
  • 如何解决Ubuntu18.04循环登录/卡在开机界面/无法进入图形界面的问题

    如何解决Ubuntu18.04循环登录/卡在开机界面/无法进入图形界面的问题

    这篇文章主要介绍了如何解决Ubuntu18.04循环登录/卡在开机界面/无法进入图形界面的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • linux系统下使用tcpdump进行抓包方法

    linux系统下使用tcpdump进行抓包方法

    在本篇文章中小编给大家分享了关于linux系统下使用tcpdump进行抓包的方法和相关知识点,需要的朋友们学习下。
    2019-04-04
  • Vim中的几种文件备份方法总结

    Vim中的几种文件备份方法总结

    最近在MCTF上看到了Vim的undo备份,顺手学习了下 Vim 的几种备份机制,所以这篇文章主要给大家介绍了关于Vim中的几种文件备份,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-04-04

最新评论