我正在使用 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 源代码 USR1 确实应该轮换日志
...所以我怀疑 killall
没有将命令发送到正确的进程。
要找出这一点,请使用 ps
检查您的进程列表。如果您发现 gunicorn
进程,请修改 workers/base.py
以打印日志条目以查看它们是否收到信号。尝试手动发送信号,如果它有效,那么它是 logrotate 配置,但不知何故不起作用。
我是一名优秀的程序员,十分优秀!