如何在不打开/活动文件的情况下手动旋转日志?

我的Google-Fu让我如此接近,但还不够完美,我想我在Linux中太绿了,把它们放在一起。

我有一个非常大的> 200GB的日志文件,仍然被写入。 Logrotate在磁盘空间可能成为问题之前不会及时得到它。 另外,我不想logrotate另一轮logrotate ,因为我不希望它在其configuration中影响所有其他目标。 我已经在我的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 } 

我想手动做这些事情:

  1. copytruncate:抓取当前的日志文件,但是允许syslog-ng保持当前的打开/活动文件
  2. (不在logrotate.conf中) split :将当前日志分割成更小的块
  3. xz :压缩到存档文件夹

我可以split(1)xz(1)就好,但是当我试图抓住目标文件,没有骰子。

我尝试了sudo mv myDevice.log ZmyDevice.log && touch myDevice.log ,但syslog-ng只是移动原始文件(及其新名称),并保持愉快的写道。 自从我思考syslog-ng如何引用该文件以来,这个问题就有了一些改进。

所以我想弄清楚如何做一些手动的copytruncate ,以便将文件切换到原来的位置,并让syslog-ng保持原样。

移动文件,然后发送一个SIGHUP到syslog-ng进程:

杀-HUP

这将导致它重新打开所有打开的文件,从而释放刚刚移动/重命名的文件,并允许您继续。 然后它会打开/log/myDevice/myDevice.log新鲜并开始写入。

find哪个进程打开文件: fuser /path/to/file 。 然后使用kill -SIGSTOP暂停正在写入文件的进程。 然后旋转文件,复制它,截断它,无论你需要做什么,然后用kill -SIGCONT恢复进程。