linux - 如何确保可以终止 Docker 入口点启动的进程?
问题描述
我正在构建一个启动长时间运行的 Java 进程的 Docker 映像。我想确保它可以与容器一起被杀死(例如,通过使用 Ctrl+C)但仍然执行清理。
如果我exec java -jar
在我的入口点中使用,它会按预期工作。如果我只是在执行java -jar
,则无法终止该进程。
但是exec
,即使成功也使容器退出,如果此命令不是入口点中的最后一个命令,那将是一个问题。例如,如果随后进行了一些文件转换或清理,它将不会被执行:
exec java -jar "./lib/Saxon-HE-${SAXON_VER}.jar" -s:"$json_xml" -xsl:"$STYLESHEET" base-uri="$base"
rm "$json_xml"
我认为解释是使用exec
该进程(java
在这种情况下)变为 PID=1 并接收终止信号,而没有exec
它会获得其他一些 PID 并且不接收信号,因此无法被终止。
所以我的问题有两个:
- 是否有一种解决方法可以在不成功退出容器的情况下终止进程
exec
? - 即使进程被杀死/退出,我如何确保
exec
(在这种情况下)之后的清理被执行?rm
解决方案
您可以构建另一个程序来管理 java 子进程和清理,例如使用相同的java
,go
或rust
编写这样的程序。我确信这些语言有适当的进程控制工具,你可以捕获 CTRL-C 和其他事件来停止内部子进程并进行清理。与搜索无论如何都会具有有限行为的工具相比,它可能甚至会花费更少的时间。此外,为此类问题开源它甚至可能是值得的。
推荐阅读
- android - Android/Room/ViewModel:将 ViewModel 保存到房间数据库时出错
- angular - Is there a better way to update single items in ngFor Angular?
- javascript - 用于向 multer 发送数据的反应代码中的问题
- rust - trait impl 的委派只能在夜间进行?
- node.js - 检查该值是否是模型续集中的电话号码
- python - 无法在 plotly express 中从 hover_data 中删除 id 和 label
- python - python读取文件并输出为格式字符串
- javascript - node.js 和 pug 中用户单击按钮和删除前一个问题时如何显示新问题?
- php - 我们应该将 laravel hasone 关系 return null 替换为对象数组吗?
- python - 关于tf2_ros与python3的兼容性问题?