3

我正在使用 logrotated 来旋转 gunicorn 访问日志。这是我的 logrotated 配置

/opt/api/log/access.log {
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        killall -s USR1 gunicorn
    endscript
}

日志被正确轮换、压缩,并创建了一个新的 access.log。但是,gunicorn 不会释放指向旧日志文件的“指针”,因此旋转实际上并没有释放磁盘空间。

我仍然可以使用它查看条目lsof

如果我这样做initctl restart api,gunicorn 将重新启动,磁盘空间最终被释放。

如何以比重新启动服务更清洁的方式释放磁盘空间?

4

2 回答 2

3

通常 Linux 进程接受一个特殊的信号来通知它们有关日志文件的轮换。在这种情况下,您将发送信号SIGUSR1以处理gunicorn系统上的所有进程。

问题是

  • 您正在运行的系统中是否存在这样的进程

  • 进程是否gunicorn接受SIGUSR1信号

根据 gunicorn 源代码 USR1 确实应该轮换日志

...所以我怀疑可能killall没有将命令发送到正确的进程。

要找出这一点,请使用 . 检查您的进程列表ps。如果您找到gunicorn进程,请修改workers/base.py以打印日志条目以查看它们是否收到信号。尝试手动发送信号,如果它有效,那么它是 logrotate 配置,它不起作用。

于 2014-06-10T17:03:29.143 回答
1

回答我自己的问题,似乎我遇到了这个错误:https ://github.com/benoitc/gunicorn/issues/627

有一个修复它,但它还没有进入发行版。

于 2014-06-11T13:15:56.043 回答