我的 Google-Fu 让我非常接近了,但还是没有完全达到,而且我想我对 Linux 还太陌生,无法把这些部分整合在一起。
我有一个非常大的 >200GB 日志文件,仍在写入。Logrotate 无法及时处理它,否则磁盘空间可能会成为问题。另外,我不想再启动一轮logrotate
,因为我不想影响其配置中的所有其他目标。我已在文件中添加了新的节,logrotate.conf
如下所示:
/log/myDevice/myDevice.log {
compress
daily
rotate 360
maxage 360
missingok
compresscmd /usr/bin/xz
dateext
compressext .xz
copytruncate
olddir /log/archive/myDevice
}
我想手动做这些事情:
- copytruncate :抓取当前日志文件,但允许 syslog-ng 继续处理当前打开/活动文件
- (不在上述 logrotate.conf 中)
split
:将当前日志卷分解成更小的块 xz
:压缩到存档文件夹
我可以,split(1)
而且xz(1)
很好,但是当我尝试抓取目标文件时,却没有成功。
我尝试过sudo mv myDevice.log ZmyDevice.log && touch myDevice.log
,但是 syslog-ng 只是带着原始文件(和它的新名称)移动并且继续愉快地写入。当我思考 syslog-ng 如何引用该文件时,我感到有点意外。
因此,我试图弄清楚如何做某种手册copytruncate
,以便将文件剪切到另一个“就地”的文件,并让 syslog-ng 继续执行它想要的内容。
答案1
移动文件,然后向 syslog-ng 进程发送 SIGHUP:
终止-HUP
这将导致它重新打开所有打开的文件,从而释放您刚刚移动/重命名的文件并允许您继续。然后它将重新打开 /log/myDevice/myDevice.log 并开始写入。
答案2
查找哪些进程打开了文件:fuser /path/to/file
。然后使用kill -SIGSTOP
暂停正在写入文件的进程。然后旋转文件、复制文件、截断文件,无论您需要做什么,然后使用 恢复进程kill -SIGCONT
。