Node.js docker里面的僵尸
我有一个docker容器,它运行node.js应用程序。此应用程序运行一个headless chrome实例 所有这些都可以很好地工作,但若我杀死chrome实例,并检查运行进程列表,我将看到系统中仍然有2个(实际上是3+2个cat进程)僵尸chrome进程(已失效)。我知道这是一个孩子 (指终止的母铬工艺),未正确完成并连接到初始工艺 我试图直接杀死它——被拒绝了。此外,我还尝试使用Node.js docker里面的僵尸,node.js,linux,google-chrome,docker,Node.js,Linux,Google Chrome,Docker,我有一个docker容器,它运行node.js应用程序。此应用程序运行一个headless chrome实例 所有这些都可以很好地工作,但若我杀死chrome实例,并检查运行进程列表,我将看到系统中仍然有2个(实际上是3+2个cat进程)僵尸chrome进程(已失效)。我知道这是一个孩子 (指终止的母铬工艺),未正确完成并连接到初始工艺 我试图直接杀死它——被拒绝了。此外,我还尝试使用detached:true标志生成chrome,并再次直接杀死所有子进程,当主chrome收到“退出”信号时,无
detached:true
标志生成chrome,并再次直接杀死所有子进程,当主chrome收到“退出”信号时,无论如何ps-A | grep chrome
向我显示了两个不存在的进程。有什么想法吗
UPD:
谢谢大家的帮助。添加
--init
完全解决了我的问题。使用另一个基础图像也可以很好地工作,但我认为这种方法不是必需的。此外,还可以找到对根本原因的良好描述您需要一个调用wait()
的进程来获取任何结果。在常规系统上,这由/sbin/init
处理,但在容器中,您需要提供自己的工具。如果您正在开发自己的应用程序,请考虑只在循环中调用<代码> WAITE()/<代码>。
可选的,你可以考虑一个容器特定的<代码> init < /C> >,看看是否解决了这个问题。
几乎是钉子的原因,Linux系统上的init(或SytD)在它们的父死亡时会重新收集僵尸进程。父进程应该使用wait
syscall清理自己的僵尸进程。但是,自动清理不会通过容器的命名空间边界。因此,无论您作为入口点运行什么进程,并且成为pid 1,都需要为您处理这些僵尸
对于docker的最新版本,只需将--init
传递到docker run
命令,就可以包含init进程。如果您使用的是2.2版compose文件,则有一个选项init:true
,您可以在服务上定义相同的结果
除了dumb init之外,docker还将其作为自己的docker init使用。您的意思是只运行一个“root@daf1ccd11aaa:~/myapp#wait“在docker终端内(或调用node.js exec('wait',()={…}))?如果是,这没有帮助,如果我理解错误-请解释你的建议阅读有关僵尸进程的链接文章。在调用的容器中需要一个PID 1。使用类似于
dumbinit
(或supervisord
或其他流程主管)的方法可以为您做到这一点。