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