泊坞内的僵尸
我有一个docker容器,它运行node.js应用程序。 这个应用程序运行一个无头的实例。
一切工作正常,但如果我杀死铬实例,并检查运行的进程列表,我会看到2(实际上3 + 2猫进程)僵尸铬进程( 停止 )仍然在系统中。 我知道这个进程是一个subprocess(被杀死的父进程),这个进程没有完成正确的,并附加到init进程。
我试图直接杀死它 – 拒绝。 此外,我试图产卵铬与detached:true
旗,并再次杀死所有的subprocess,当主铬接收到“退出”信号,无论如何ps -A | grep chrome
ps -A | grep chrome
显示了两个不存在给我。 有任何想法吗?
UPD:感谢所有的帮助。 添加--init
完全解决了我的问题。 使用另一个基本的图像也很好,但我决定这个方法不是必须的。 也可以在这里find根源的很好的描述
很多人认为,Linux系统上的init(或者systemd)在他们的父母死亡时收获僵尸进程。 父母应该用wait
系统调用清理自己的僵尸进程。 但是,该自动清理不会传递容器的名称空间边界。 所以,无论你作为入门点运行的进程是什么,都需要为你处理这些僵尸。
使用--init
最新版本,只需将--init
传递给--init
docker run
命令即可包含初始化进程。 如果您使用的是版本2.2撰写文件,那么您可以在服务上定义一个选项init: true
,以获得相同的结果。
除了dim -init之外, docker -init中还有一个tini ,它是docker使用的。
你需要一个调用wait()
进程来获取任何僵尸进程 。 在一个普通的系统上,这是由/sbin/init
处理的,但是在一个容器中,你将需要提供你自己的工具。 如果您正在开发自己的应用程序,可以考虑定期在一个循环中调用wait()
。
或者,你可以考虑一个特定于容器的init
比如dumb-init ,看看是否能解决问题。