容器的优雅退出(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])

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

139

被折叠的 条评论
为什么被折叠?



