我正在使用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将重新启动并最终释放磁盘空间。
如何以比重新启动服务更清晰的方式释放磁盘空间?
答案 0 :(得分:3)
通常Linux进程接受特殊的signal来通知他们有关日志文件的轮换。在这种情况下,您发送信号SIGUSR1
以处理系统上的所有gunicorn
进程。
问题是
您的正在运行的系统中是否存在此类过程
gunicorn
处理是否接受SIGUSR1
信号
根据gunicorn源代码,USR1确实应该旋转日志
...所以我怀疑killall
可能不会将命令发送到正确的进程。
要了解相关信息,请使用ps
检查您的流程列表。如果找到gunicorn
进程,请修改workers/base.py
以打印日志条目以查看它们是否收到信号。尝试手动发送信号,如果它工作,那么它是logrotate配置,它不会以某种方式工作。
答案 1 :(得分:1)
回答我自己的问题,似乎我遇到了这个错误:https://github.com/benoitc/gunicorn/issues/627
有一个修复程序,但它还没有进入发布版本。