logrotate轮转后pure-ftpd长连接日志写入旧文件问题如何修复?
解决方案
方案1:配置logrotate发送HUP信号重载日志(推荐)
Pure-FTPd对SIGHUP信号的处理逻辑就是重新打开日志文件句柄,不会断开任何活跃的FTP连接,完全符合你的需求。你只需要修改/etc/logrotate.d/pureftpd的配置如下:
/var/log/pureftpd.log { weekly notifempty missingok postrotate /bin/kill -HUP `cat /var/run/pure-ftpd.pid 2>/dev/null` 2>/dev/null || true endscript }
说明:
- 脚本会在日志文件重命名完成后,给pure-ftpd主进程发送HUP信号,让它重新打开新的
/var/log/pureftpd.log文件写入后续日志 - 信号只会发给主进程,所有子进程持有的活跃FTP连接不受任何影响,不会触发客户端断开
- 如果你的pure-ftpd pid文件路径不同,替换为实际路径即可,常见路径还有
/run/pure-ftpd.pid
方案2:使用copytruncate参数(无侵入备选)
如果你不想调整进程信号逻辑,可以直接在logrotate配置里加copytruncate参数:
/var/log/pureftpd.log { weekly notifempty missingok copytruncate }
说明:
- 该参数的逻辑是:不重命名原日志文件,先把原日志的内容拷贝到轮转后的归档文件,再直接清空原日志文件
- pure-ftpd始终持有原文件的句柄,不需要做任何调整,不会断开连接
- 缺点是拷贝和清空之间的极短时间窗口内产生的日志可能丢失,对日志完整性要求极高的场景优先选方案1
验证方法
配置修改后可以手动执行一次日志轮转测试是否生效:logrotate -f /etc/logrotate.d/pureftpd
执行后查看新生成的/var/log/pureftpd.log是否有新的日志写入,同时检查活跃的FTP连接是否正常即可。
内容的提问来源于stack exchange,提问作者Martin Tomko
相关产品推荐
相关产品推荐

