docker 容器内的 pm2-runtime 收到 SIGTERM - 为什么?
pm2-runtime inside docker container receives SIGTERM - why?
我是 运行 具有 docker 的虚拟机,它实现了我们的 CI/CD 基础架构。
docker-compose 有一个 nginx 反向代理和另一个服务。本质上,这个 docker 容器的启动命令是一个 shell 脚本,它从中央存储库创建文件的本地副本。然后这个 shell 脚本启动(通过 yarn start
)一个 nodejs 脚本,它选择几个服务并创建一个 pm2 应用程序启动 json 文件。
最后,pm2-runtime
使用此应用程序定义文件启动。这是由
完成的
const child = exec(`pm2-runtime build/pm2startup.json`)
child.stdout.on("data", data => { process.stdout.write(data); })
child.stderr.on("data", data => { process.stderr.write(data); })
child.on("close", (code,signal) => {
process.stdout.write((`pm2-runtime process closed with code ${code}, signal ${signal}\n`));
})
child.on("error", error => {
process.stderr.write((`pm2-runtime process error ${error}\n`));
})
child.on("exit", (code, signal) => {
process.stdout.write((`pm2-runtime process exited with code ${code}, signal ${signal}\n`));
})
pm2 管理的app 大约有10 个,docker stats
说容器内存消耗大于850MB。但是,我没有设置任何明确的内存限制。我也找不到任何隐含的。
时不时地重新启动服务容器。根据 dockerd 日志,它的任务已经退出。没错:据报告 pm2-runtime 进程(见上文)因 SIGTERM 而关闭。
这是我收到的与此相关的唯一消息。没有其他 pm2 消息,没有服务消息,没有 docker 事件。
现在我正在寻求建议如何找到这个 SIGTERM 的原因,因为我 运行 没有想法。
事实证明,确实是问题中的片段导致了问题。
pm2startup.json
引用长 运行 应用程序。随着时间的推移,根据使用情况,它们会在 stdout and/or stderr 上生成相当多的日志。在某些时候,exec
保留的某个缓冲区被填满,运行 pm2-runtime
的节点进程停止。不幸的是,它在没有任何提示说明崩溃原因的情况下停止了。但那是另外一回事了。
我的解决方案是不使用 exec
或 execFile
,而是使用 spawn
和 stdio 选项 {stdio: "inherited"}
(或详细版本 ["inherited", "inherited", "inherited"]
).
我是 运行 具有 docker 的虚拟机,它实现了我们的 CI/CD 基础架构。
docker-compose 有一个 nginx 反向代理和另一个服务。本质上,这个 docker 容器的启动命令是一个 shell 脚本,它从中央存储库创建文件的本地副本。然后这个 shell 脚本启动(通过 yarn start
)一个 nodejs 脚本,它选择几个服务并创建一个 pm2 应用程序启动 json 文件。
最后,pm2-runtime
使用此应用程序定义文件启动。这是由
const child = exec(`pm2-runtime build/pm2startup.json`)
child.stdout.on("data", data => { process.stdout.write(data); })
child.stderr.on("data", data => { process.stderr.write(data); })
child.on("close", (code,signal) => {
process.stdout.write((`pm2-runtime process closed with code ${code}, signal ${signal}\n`));
})
child.on("error", error => {
process.stderr.write((`pm2-runtime process error ${error}\n`));
})
child.on("exit", (code, signal) => {
process.stdout.write((`pm2-runtime process exited with code ${code}, signal ${signal}\n`));
})
pm2 管理的app 大约有10 个,docker stats
说容器内存消耗大于850MB。但是,我没有设置任何明确的内存限制。我也找不到任何隐含的。
时不时地重新启动服务容器。根据 dockerd 日志,它的任务已经退出。没错:据报告 pm2-runtime 进程(见上文)因 SIGTERM 而关闭。
这是我收到的与此相关的唯一消息。没有其他 pm2 消息,没有服务消息,没有 docker 事件。
现在我正在寻求建议如何找到这个 SIGTERM 的原因,因为我 运行 没有想法。
事实证明,确实是问题中的片段导致了问题。
pm2startup.json
引用长 运行 应用程序。随着时间的推移,根据使用情况,它们会在 stdout and/or stderr 上生成相当多的日志。在某些时候,exec
保留的某个缓冲区被填满,运行 pm2-runtime
的节点进程停止。不幸的是,它在没有任何提示说明崩溃原因的情况下停止了。但那是另外一回事了。
我的解决方案是不使用 exec
或 execFile
,而是使用 spawn
和 stdio 选项 {stdio: "inherited"}
(或详细版本 ["inherited", "inherited", "inherited"]
).