如何解决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'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。