我遇到了奇怪的行为,我的 Docker 映像有以下入口点脚本:
#!/bin/bash
trap " \
service apache2 stop; \
" SIGHUP SIGINT SIGTERM
trap "exit" ERR
service apache2 start
tail -f /var/log/apache2/access.log
上面的脚本确实不是按预期处理 SIGTERM,但它什么也不做!(我在 Apache 日志中看到,它被不干净地终止了),Docker 等待 10 秒钟然后将其杀死。
但是当我将最后一行改为以下内容时,它运行完美!
tail -f /var/log/apache2/access.log & wait
以下也做了不是工作:
tail -f /var/log/apache2/access.log &
有人能为我解释一下这种行为吗?我不明白为什么会发生这种情况。这背后有什么魔力& wait
?有没有更好的方法可以让 Docker 容器保持运行,同时能够处理信号?
答案1
有点晚了,但是 bash 不会处理陷阱,直到当前命令退出(tail),与普遍的看法相反,它不会这样做。'wait' 很特殊并且是可中断的。