Docker kill 1无效

news/2025/1/16 5:44:26/

前言

我们在平常强制停用一个进程的时候, 会选择什么命令? 一般在测试使, 不考虑程序突然中断带来的影响, 直接使用kill -9 pid强制停止就行.

但是, 就在刚刚, 我启动了一个docker容器, 进入容器后执行命令kill -9 1没有任何效果??? 啊这, 为什么呀?

尝试

为了解释这个现象, 我进行了一系列测试, 这里简单说一下, 具体过程就不细写了:

  • 其他进程: 使用kill -9杀掉pid不为1的进程, 是可以杀掉的
  • 其他信号: 编写进程捕获其他信号(如SIGTERM), 进程可以正常捕获

经过测试得出结论, pid为1的进程不会处理信号SIGKILL

解惑

那么为什么会这样呢? 我们知道, SIGKILL信号进程是不能捕获的, 只能执行操作系统规定的行为, 那么就有两个合理的猜测:

  1. 操作系统忽略了, 没有将信号发送给进程
  2. 进程收到了信号, 只是pid=1的进程忽略了

那么究竟是怎么回事呢? 我找了些资料, 大概了解了此过程. 在man手册中也有介绍.

首先, pid=1是操作系统的守护进程, 其他所有的进程都是通过这个进程来启动的. 操作系统在发送信号时, 会进行是否忽略的判断, 这里以Linux 6.0为例, 判断的方法名称为sig_task_ignored, 对其进行简单分析:

static bool sig_task_ignored(struct task_struct *t, int sig, bool force)
{// .../*分析一下其中各个判断: unlikely(t->signal->flags & SIGNAL_UNKILLABLE)进程的 SIGNAL_UNKILLABLE 标志位是否为 true在每个 pid namespace 的 init 进程创建时, 都会标记此标志源码位置可见(我也没看懂...): https://github.com/torvalds/linux/blob/v6.0/kernel/fork.c#L2442结果: init 进程恒为 truehandler == SIGDFL判断信号的处理是否是默认的, 如果进程自己捕获了则为 false!(force && sig_kernel_only(sig))force: 同一个 pid namespace 发送信号时, 恒为0sig_kernel_only: 判断信号是否为 SIGSTOP 或 SIGKILL结果: 因此, 此条件恒为 true结果: 对于 init 进程来说, 第一个和第三个条件都恒为true, 因此是否忽略完全在于此信号进程是否进行了捕获*/if (unlikely(t->signal->flags & SIGNAL_UNKILLABLE) &&handler == SIG_DFL && !(force && sig_kernel_only(sig)))return true;// ...
}

因此, init进程, 若捕获了信号则能收到, 否则收不到. 而在所有的信号中(可通过 kill -l查看), SIGSTOP/SIGKILL这两个信号是不允许进程捕获的.

那么如何知道进程是否主动捕获了信号呢? 可以使用命令: cat proc/347/status | grep SigCgt, 将16进制转为2进制, 最右侧为1说明进程捕获了信号1. 具体可见这里

至此, 已经基本解决了之前的疑惑.

解决

  1. 在宿主机中执行kill. 因为容器中的守护进程在宿主机中的pid并不为1

  2. docker run --init. 启动容器的时候添加--init参数, 这样容器会启动一个守护进程来转发, 你运行的进程就不是守护进程啦.

    原文地址: https://hujingnb.com/archives/864


http://www.ppmy.cn/news/864873.html

相关文章

kill 命令杀死父进程和所有子进程

当一个进程有很多个子进程时: ps -ef | grep nginx 使用kill -TERM 8771 命令可以杀死所有的进程

《死神》现队长、原队长和假面的对照

现任队长原队长假面其他说明一番队队长:山本元柳斎 重国山本元柳斎 副队长:无名氏 二番队队长:砕蜂 四枫院夜一 副队长:大前田 希千代 三番队队长:市丸 银 罗兹? 风桥楼十郎 原队长引退,银刚入队…

浅谈《白夜行》结局

这个假期利用碎片时间二刷了《白夜行》这本书,因为之前看过一次,所以第二次看得很快。看第二遍显然没有第一遍时的心潮起伏,更多的是感慨与思考。 全书的结尾是以亮司的自杀而画上了句号,他从商场二楼纵身跃下一楼,同时…

白胡子不杀黑胡子的真正原因

通过第576话,我们发现,即使白胡子已经处于强弩之末,还是有机会有能力干掉黑胡子的,可是,为什么他后来放弃了。 原因在于他跟罗杰之间的谈话,罗杰告诉他“D”的名字的含义,因为这关系到整个世界的…

升级至iOS17公测版系统后如何降级?iOS 17 Beta降级详细教程

苹果最近发布iOS 17首个公测版,许多果粉都迫不及待地进行了更新。但是不少小伙伴升级iOS 17后iPhone遇到了一些问题,例如APP闪退、吃内存、耗电快等。Bug太多导致体验很差,想要降级到iOS 16系统。 升级iOS 17beta后悔了?其实只要苹…

递归总结

递归每次自己调用自己,每次调用自己后函数的数据会较上次缩减,而且最后缩减至无需继续递归。内层函数调用完成,外层函数才算调用完成 n的阶乘伪代码 外层必须逐级向里面递,最后再向外归。 public class 递归_02 {public static vo…

http://www.iplaysoft.com/archives

http://www.iplaysoft.com/archives

Android 播放音频(PCM)的两种方法--AudioTrack/OpenSL ES使用简介

本文主要介绍Android上可以进行音频(PCM)播放的两个组件–AudioTrack/OpenSL ES的简单使用方法。 对一个音频文件(如MP3文件),如何使用FFmpeg进行解码获取到PCM,之前的文章已经有相应的说明: h…