容器实战高手 · 容器进程

为啥不能在容器中kill 1号进程

  1. 1 号进程是第一个用户态的进程,由它直接或者间接创建了 Namespace 中的其他进程。
  2. 进程在处理大部分信号时有三个选择:忽略、捕获和缺省行为。其中两个特权信号 SIGKILL 和 SIGSTOP 不能被忽略或者捕获。
  • 答:kill -9 1 在容器中是不工作的,内核阻止了 1 号进程对 SIGKILL 特权信号的响应。
    kill 1 分两种情况:如果 1 号进程没有注册 SIGTERM 的 handler,那么对 SIGTERM 信号也不响应;如果注册了 handler,那么就可以响应 SIGTERM 信号。
  • 换句话说:
    1. 在容器中,1 号进程永远不会响应 SIGKILL 和 SIGSTOP 这两个特权信号;
    2. 对于其他的信号,如果用户自己注册了 handler,1 号进程可以响应。

为啥我的容器如此多僵尸进程

  1. 进程运行时的状态:运行态(R stat)和睡眠态(可被打断S stat、不可被打断D stat)
  2. 进程在调用 do_exit() 退出的时候状态的:退出前EXIT_ZOMBIE(僵尸进程状态)、退出瞬间EXIT_DEAD;
  3. 查看系统可以开启的最大进程数:cat /proc/sys/kernel/pid_max
    Linux 内核在初始化系统的时候,会根据机器 CPU 的数目来设置 pid_max 的值。
  4. 在一个容器建立之后,创建容器的服务会在 /sys/fs/cgroup/pids 下建立一个子目录,就是一个控制组,控制组里最关键的一个文件就是 pids.max,文件数值就是这个容器中允许的最大进程数目。
  5. 残留的僵尸进程,在容器里仍然占据着进程号资源,很有可能会导致新的进程不能运转。
  • 答:父进程在创建完子进程之后就不管了,这就是造成子进程变成僵尸进程的原因。
    • 在 Linux 中的进程退出之后,如果进入僵尸状态,我们就需要父进程调用 wait() 这个系统调用,去回收僵尸进程的最后的那些系统资源,比如进程号资源。
    • wait() 系统调用是一个阻塞的调用,也就是说,如果没有子进程是僵尸进程的话,这个调用就一直不会返回,那么整个进程就会被阻塞住。不阻塞的可以调用waitpid(),传入WNOHANG参数表示没有僵尸进程时马上返回。(tini
    • 容器中所有进程的最终父进程是 init 进程,由它负责生成容器中的所有其他进程。因此,容器的 init 进程有责任回收容器中的所有僵
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值