Docker经典面试题:能在容器里面通过 kill -9 杀死容器吗?

Docker经典面试题:能在容器里面通过 kill -9 杀死容器吗?

之前介绍PID Namespace文章的时候已经介绍了,容器里面第一个进程的PID为 1.那么当我们进入容器后,能否通过

# kill -9 1

的方式杀死自己吗 ?

答案是不能,SIGKILL(-9)信号有两个特殊的地方:1、除了PID为1的进程以外,其他进程不能忽略这个信号,2、不允许捕获,注册handler。这个其实很容易理解,SIGKILL的目的是强制杀死进程,如果进程自己捕获处理后,并没有执行exit退出,那么就永远无法杀死了。而PID为1 的进程,通常称为init进程,是忽略SIGKILL信号的,所以无法在容器的PID Namespace里面杀死的。

细心的你可能已经发现了,我说的是无法在容器内的PID Namespace里面杀死。那么,容器外呢?当然可以,docker kill 命令就是在容器外通过发送SIGKILL杀死容器的,因为在宿主机上,这个init进程的ID已经不再是1 了。

那我们可以在容器内部通过信号杀死自己吗?还是回到上面说的,SIGKILL信号不能被捕获,但其他信号可以啊。譬如 SIGQUIT、SIGTERM。下面是一个捕获SIGQUIT的Demo

#include 
#include 
#include 
#include 

void handler(int sig)
{
	exit(sig);
}


int main(int argc, char *argv[])
{
	int duration;
	if (argc > 1)
	{
		duration = atoi(argv[1]);
		printf("Sleeping for %ds
", duration);
		sleep(duration);
		exit(EXIT_SUCCESS);
	}
	if(signal(SIGQUIT, handler) == SIG_ERR)
		exit(EXIT_FAILURE);

	for (;;)
		pause();
}

执行代码编译(gcc -Wall a.c -o a.o && ./a.o) 后通过Dockerfile打到镜像里面,启动进入容器便可以通过 ”kill -3 “杀死容器,优雅退出了。如下所示。

[root@test ~]# docker exec -it cd1c839a758d  sh
sh-4.4#
sh-4.4# kill -9 1
sh-4.4#
sh-4.4# kill -3 1
sh-4.4# [root@test ~]#

上面也顺便演示了在容器里面通过”kill -9 “ 是无法杀死容器的。

展开阅读全文

页面更新:2024-04-24

标签:容器   宿主   不允许   演示   细心   进程   信号   优雅   命令   答案   代码   方式   地方   经典   文章   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top