容器的优雅退出(1):是 SIGKILL 吗?

本文探讨了在容器平台如Kubernetes和Docker中,如何优雅地停止容器。通常,Containerd会向init进程发送SIGTERM信号,而其他进程则接收到无法捕获的SIGKILL。这种硬关闭方式不适用于需要清理工作的应用。作者通过实例展示了容器进程如何响应这些信号,并提出了如何实现容器的优雅退出。

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

容器的优雅退出(1):是 SIGKILL 吗

我们在容器平台上,如果想要停止一个容器,无论是在 Kubernetes 中删除一个 pod,还是用 Docker 来停止一个容器,最后都会使用 Containerd 这个服务。而 Containerd 在停止容器时,就会去向容器的 init 进程发送一个 SIGTERM 信号。在 init 进程退出后,容器内的其他进程也会立刻退出。不过不同的是,init 进程收到的是 SIGTERM 信号,而容器内的其他进程收到的则是 SIGKILL 信号。

SIGKILL 这个信号在 Linux 中属于特权信号,不能被忽略和捕获。这个信号不能被捕获,也就代表用户无法注册自己的 handler,那么应用就会直接退出。

我们可以先动手试一下,是不是像我说的那样:

我写了一个简单例子,C代码如下:

shutdown.c :

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void signal_handler(int signalno)
{
   
    if (signalno == SIGTERM) 
    {
   
        printf("received SIGTERM\n");
        exit(0);
    }
}

int main(int argc, char *argv[])
{
   
    int i;
    int total;

    if (argc < 2)
    {
   
        total = 1;
    } 
    else 
    {
   
        total = atoi(argv[1])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值