我正在为 Docker 准备一个脚本,它只允许一个顶级进程,它应该接收信号,以便我们可以停止它。
因此,我有一个这样的脚本:一个应用程序写入 syslog(此示例中为 bash 脚本),另一个应用程序仅打印它。
#! /usr/bin/env bash
set -eu
tail -f /var/log/syslog &
exec bash -c 'while true ; do logger aaaaaaaaaaaaaaaaaaa ; sleep 1 ; done'
几乎解决了:当顶级进程bash
获得 SIGTERM 时——它存在,但tail -f
继续运行。
当父进程退出时,如何指示tail -f
退出?例如它也应该收到信号。
注意:不能使用 bash 陷阱,因为exec
最后一行完全替换了进程。
答案1
如果您很幸运,您可以使用 GNU coreutils 中的 tail 命令--pid=<number>
。大写选项-F
可让您避免日志轮换。
tail --pid="$$" -F /var/log/syslog &
更多信息:http://www.gnu.org/software/coreutils/manual/html_node/tail-invocation.html