对于我们在容器内运行的应用程序,最好在容器(正常)关闭时接收 SIGTERM。同时,我们希望它的输出进入日志文件。
因此,在我们的 docker 容器的启动脚本中,我们一直在使用 bashexec
与此类似
exec command someParam >> stdout.log
这工作得很好,command
替换了作为容器根进程并接收 SIGTERM 的 shell。
由于应用程序倾向于记录大量日志,我们决定使用 Apache 的rotatelogs
工具添加日志轮换,即
exec command | rotatelogs -n 10 stdout.log 10M
唉,似乎通过使用管道, exec 不能再command
更换外壳了。用 来查看正在运行的容器中的进程时pstree -p
,现在看起来像这样
mycontainer@/#pstree -p
start.sh(1)-+-command(118)
`-rotatelogs(119)
所以 bash 仍然是根进程,并且不会将 SIGTERM 传递给命令。在偶然发现 exec 之前,我发现了一种将信号处理程序安装到 bash 脚本中的方法,然后它本身会command
使用kill
. 然而,这变得非常复杂,获取 PID 也并不总是那么简单,我想在信号处理和获取管道以进行日志轮换时保留 exec 的便利性。知道如何做到这一点吗?