exec作为管道组件

问题描述

对于在容器中运行的我们的应用程序,最好是在(正常)关闭容器时收到SIGTERM。同时,我们希望将其输出保存到日志文件中。

因此,在我们的Docker容器的开始脚本中,我们一直在使用与此类似的bash的exec

exec command someParam >> stdout.log

效果很好,command替换了曾经是容器根进程的外壳,并且将收到SIGTERM。

由于应用程序倾向于记录很多日志,因此我们决定使用Apache的rotatelogs工具(即

)来添加日志轮播。
exec command | rotatelogs -n 10 stdout.log 10M

A,看来通过使用管道,exec不再可以用command替换shell。现在,使用pstree -p查看正在运行的容器中的进程时,看起来像这样

mycontainer@/#pstree -p
start.sh(1)-+-command(118)
            `-rotatelogs(119)

因此bash仍然是根进程,并且不会将SIGTERM传递给命令。 在绊倒exec之前,我发现了一种将信号处理程序安装到bash脚本中的方法,然后该方法本身将使用command将SIGTERM发送到kill进程。但是,这确实变得令人费解,获得PID也不总是那么简单,我想保留exec在处理信号获取用于日志轮换的管道方面的便利。 知道如何实现吗?

解决方法

也许你想要

exec sh -c 'command | rotatelogs -n 10 stdout.log 10M'