kill -9 杀不死的进程处理办法

本文探讨了在Linux环境下无法使用kill命令终止的进程问题,特别是针对Nagios检查进程的情况。文章分析了进程显示为D状态的原因,并解释了在这种状态下进程不受信号影响的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kill -9发送SIGKILL信号将其终止,但是以下两种情况不起作用:
a、该进程处于"Zombie"状态(使用ps命令返回defunct的进程)。此时进程已经释放所有资源,但还未得到其父进程的确认。"Zombie"进程要等到下次重启时才会消失,但它的存在不会影响系统性能。
b、 该进程处于"kernel mode"(核心态)且在等待不可获得的资源。处于核心态的进程忽略所有信号处理,因此对于这些一直处于核心态的进程只能通过重启系统实现。进程在AIX 中会处于两种状态,即用户态和核心态。只有处于用户态的进程才可以用“kill”命令将其终止  

  

  

  

Linux下怎么都kil不掉的进程
2011-03-23 14:01
无论是kill -9还是kill -15,还是其它信号量都kill不掉, 这些进程是Nagios检查进程. 难不成和我刚做的Oracle主备切换有关系? 如下:

# ps -ef | grep find | grep -v grep
nagios    4507     1  0 Mar22 ?        00:00:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
nagios    5940     1  0 Mar22 ?        00:00:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
nagios    7470     1  0 Mar22 ?        00:00:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
root      8880     1  0 Mar22 ?        00:00:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
root      9003     1  0 Mar22 ?        00:00:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
root      9150     1  0 Mar22 ?        00:00:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
nagios   16276     1  0 Mar22 ?        00:00:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
nagios   25925     1  0 Mar22 ?        00:00:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
nagios   27372     1  0 Mar22 ?        00:00:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls

可以看出父进程是1,即init进程.

# ps aux | grep find | grep -v grep   
nagios    4507  0.0  0.0  5328  644 ?        D    Mar22   0:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
nagios    5940  0.0  0.0  3816  556 ?        D    Mar22   0:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
nagios    7470  0.0  0.0  5412  640 ?        D    Mar22   0:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
root      8880  0.0  0.0  5516  496 ?        D    Mar22   0:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
root      9003  0.0  0.0  4268  572 ?        D    Mar22   0:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
root      9150  0.0  0.0  3860  572 ?        D    Mar22   0:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
nagios   16276  0.0  0.0  5604  640 ?        D    Mar22   0:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
nagios   25925  0.0  0.0  4504  644 ?        D    Mar22   0:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls
nagios   27372  0.0  0.0  4992  644 ?        D    Mar22   0:00 /usr/bin/find / -maxdepth 2 -type f -mmin -61 -ls


可以看出这些进程的状态是D. 我们知道D(disk)状态的进程是硬件资源不满足而处于深度休眠状态, 一般是等待磁盘. 这种进程用kill -9杀不掉, 要么继续等, 要么重启. 难道只能重启服务器才能解决么???

 

 

$ cat /proc/21520/status
Name:   ssuser
State:  D (disk sleep)   深度睡眠是不处理信号量的
SleepAVG:       94%
Tgid:   21520
Pid:    21520
PPid:   1
TracerPid:      0
Uid:    505     505     505     505
Gid:    505     505     505     505
FDSize: 256
Groups: 505
VmPeak: 55344620 kB
VmSize: 55282156 kB
VmLck:         0 kB
VmHWM:  29998216 kB
VmRSS:  29989616 kB
VmData: 55228868 kB
VmStk:        84 kB
VmExe:        64 kB
VmLib:      5768 kB
VmPTE:    108044 kB
StaBrk: 00616000 kB
Brk:    4088b000 kB
StaStk: 7fff33620fb0 kB
Threads:        8
SigQ:   9/137216
SigPnd: 0000000000000000
ShdPnd: 00000000400845a3
SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 0000000180000002
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
Cpus_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,ffffffff
Mems_allowed:   00000000,00000003


ps -ef | grep ocs | grep -v grep | cut -c 9-15 | xargs kill -s 9
kill -kill pid

### 关于 `mosquit` 进程无法被 `kill -9` 终止的解决方案 在 Linux 中,`kill -9` 是一种强制终止进程的方法,它通过向目标进程发送 SIGKILL 信号来立即停止该进程。然而,在某些情况下,即使使用了 `kill -9`,也可能无法成功终止特定进程(如 `mosquit`)。这通常是因为进程进入了可中断状态 (D state),或者存在其他系统级问题。 以下是针对此情况的一些可能原因及解决方法: #### 可能的原因分析 1. **进程处于 D 状态** 如果 `mosquit` 进程进入了一个可中断的状态(Disk Sleep),这意味着它正在等待 I/O 操作完成,并且会响应任何信号,包括 SIGKILL[^3]。 2. **权限足** 即使使用了 `sudo` 提升权限,仍可能存在权限配置错误的情况,导致无法完全控制目标进程。 3. **僵尸进程或孤儿进程** 子进程可能会成为孤儿进程并由 init 或 systemd 接管。此时,虽然父进程已终止,但子进程仍然存活[^1]。 4. **硬件或文件系统锁定** 当磁盘分区挂载异常或设备忙时,依赖这些资源的进程可能无法正常退出。 --- #### 解决方案 ##### 方法一:确认进程状态 首先检查 `mosquit` 的具体状态: ```bash ps aux | grep mosquit ``` 观察输出中的 STAT 列。如果显示为 “D”,表示进程正处于可中断睡眠状态。 ##### 方法二:重新加载服务管理器 对于现代 Linux 发行版,`mosquitto` 往往作为 systemctl 服务运行。可以通过以下方式重置其状态: ```bash sudo systemctl stop mosquitto.service sudo systemctl reset-failed mosquitto.service ``` ##### 方法三:卸载相关锁文件 有时,由于文件系统损坏或其他原因,进程会被卡住。尝试手动删除与 `mosquit` 相关的 PID 文件或日志锁文件: ```bash rm /var/run/mosquitto.pid journalctl --vacuum-time=1d # 清理旧的日志记录 ``` ##### 方法四:重启整个系统 如果上述方法均失败,则建议安全地重启服务器以释放所有未清理的资源: ```bash sudo reboot ``` 这种方法能够彻底清除内存中残留的任务和句柄[^5]。 ##### 方法五:调试循环逻辑 假如怀疑程序内部存在问题(例如无限循环),可利用 GDB 调试工具附加到目标进程中诊断根本原因: ```c gdb attach $(pidof mosquit) bt full # 查看当前调用栈信息 detach # 完成后分离GDB连接 q # 退出GDB环境 ``` --- ### 注意事项 - 使用 `kill -9` 应格外小心,因为强行进程可能导致数据丢失以及临时文件未能正确移除等问题[^2]。 - 对生产环境中重要应用实施此类操作前务必做好备份工作以防万一。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值