Logrotate postrotate和docker exec奇怪的行为

时间:2017-09-04 20:42:19

标签: bash docker logrotate

我正在尝试使用docker容器配置logrotate。我在docker容器中运行httpd作为后台进程,在logrotate之后我需要重新加载它以使用新的日志文件。由于可能的停机时间,我不想重新启动容器。使用docker kill --signal=HUP <container>发送SIGHUP不起作用,因为我的入口点是不处理信号的bash脚本。我试着在logrotate配置中这样做:

...
sharedscripts
postrotate
    service httpd reload > /dev/null 2>/dev/null || true
    docker exec some-container kill -HUP $(ps -e | awk '{print $1}')>>/tmp/exec-out.log 2>>/tmp/exec-out.log || true
endscript

但我得到了

kill: sending signal to 30 failed: No such process
kill: sending signal to 31 failed: No such process
kill: sending signal to 32 failed: No such process
kill: sending signal to 33 failed: No such process
kill: sending signal to 34 failed: No such process
kill: sending signal to 35 failed: No such process
kill: sending signal to 36 failed: No such process
kill: sending signal to 37 failed: No such process
kill: sending signal to 38 failed: No such process

我对docker和linux很新,我真的不明白为什么docker会获得不存在的进程id。

编辑:如果可能的话,我也不想更改bash脚本来捕获SIGHUP,而是在logrotate配置中解决问题。

1 个答案:

答案 0 :(得分:0)

我相信$(ps -e | awk '{print $1}')>>/tmp/exec-out.log 2>>/tmp/exec-out.log || true正在主机的上下文中运行,而不是在docker中运行,因此您可以看到错误的pid。

如果您使用pid=host运行泊坞窗容器,则pids将起作用。

或者你可以这样得到pid:

docker inspect --format {{.State.Pid}} <container>

但是你实际上并不需要pid,你可以自己使用docker kill发送信号,如下所示:

docker kill --signal=HUP some-container