Ole*_*kov 5 linux google-chrome node.js docker
我有一个 docker 容器,它运行 node.js 应用程序。该应用程序运行一个 headless-chrome 实例。
一切正常,但如果我杀死 chrome-instance,并检查运行的进程列表,我将看到 2 个(实际上是 3 + 2 个 cat 进程)僵尸 chrome 进程(已失效)仍在系统中。我知道这个进程是一个子进程(被杀死的父chrome 进程的),它没有正确完成并附加到init进程。
我试图直接杀死它——被拒绝了。另外,我尝试使用detached:true标志生成 chrome,并再次直接杀死所有子进程,当主 chrome 收到“退出”信号时,无论如何向我ps -A | grep chrome显示两个已失效的进程。有任何想法吗?
UPD:
感谢大家的帮助。添加--init完全解决了我的问题。使用另一个基础图像也效果很好,但我认为这种方法没有必要。还可以在这里找到根本原因的详细描述
larsks 几乎指出了原因,Linux 系统上的 init (或 systemd)在其父进程死亡时会收获僵尸进程。父进程应该使用wait系统调用清理自己的僵尸进程。但是,该自动清理不会通过容器的命名空间边界。因此,无论您作为入口点运行什么进程(并且变成 pid 1),都需要为您处理这些僵尸进程。
--init使用最新版本的 docker,您只需传递给命令即可包含 init 进程docker run。如果您使用的是 2.2 版撰写文件,则可以init: true在服务上定义一个选项以获得相同的结果。
除了dumb-init之外,还有tini,docker在幕后使用它作为自己的docker-init。
| 归档时间: |
|
| 查看次数: |
3343 次 |
| 最近记录: |