我正在使用 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 将重新启动并且磁盘空间最终被释放。
如何以比重启服务更干净的方式释放磁盘空间?
最佳答案
通常 Linux 进程接受一个特殊的 signal通知他们日志文件轮换。在这种情况下,您将信号 SIGUSR1
发送到以处理系统上的所有 gunicorn
进程。
问题是
你运行的系统中是否存在这样的进程
gunicorn
进程是否接受SIGUSR1
信号
根据 gunicorn 源代码 USR1 确实应该轮换日志
...所以我怀疑 killall
没有将命令发送到正确的进程。
要找出这一点,请使用 ps
检查您的进程列表。如果您发现 gunicorn
进程,请修改 workers/base.py
以打印日志条目以查看它们是否收到信号。尝试手动发送信号,如果它有效,那么它是 logrotate 配置,但不知何故不起作用。
关于python - Gunicorn 在 logrotate 后坚持旧日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24146006/