使用 SED 删除写入的日志 - /var/log/messages

使用 SED 删除写入的日志 - /var/log/messages

我有一个文件系统,占用率超过 60%。我发现文件 /var/log/messages 有超过 400 万行,所以我决定删除 200 万行以腾出一些空间。我执行了以下命令

sed -i '1,2000000d' /var/log/messages

这些行被删除,日志大小减少了约 300MB,但文件系统使用率从 60% 增加到了 90%。

然后我重新启动了服务rsyslog,但什么也没发生,使用率仍然是90%。

请注意,如果我执行命令 du -sh *,然后计算每个文件的使用量,则总使用量与文件系统的“已使用”值不符。似乎应该有一个隐藏文件占据了剩余的空间,但我不知道如何找到或删除它。

答案1

我认为不建议在使用时删除文件,因为可能会导致此类行为。我见过一些案例,有些用户在应用程序仍在登录时删除/缩小了大文件,而文件系统直到他们重新启动应用程序才注意到大小的变化。

在许多发行版中,您可以使用 logrotate 来旋转此文件并避免日志填满分区。在 RHEL6 中,您可以通过编辑文件/etc/logrotate.conf并添加如下块来配置此功能:

/var/log/messages { rotate 4 size 50M postrotate /usr/bin/killall -HUP syslogd endscript }

解释:

  1. rotate 4:保留最后四个文件。
  2. 大小 50M:当大小超过 50M 时,就会进行轮换。
  3. /usr/bin/killall:旋转后执行的命令。

请参阅手册页中的更多信息:man logrotate

笔记:您可以通过重新启动节点来回收空间。

我希望这有帮助。

答案2

最后我找到了解决这个问题的方法。

问题是被删除的文件仍然被系统打开

[root]# lsof | grep messages
COMMAND     PID      USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
abrt-dump  2015      root    4r      REG              252,6 417938659        195 /var/log/messages (deleted)
[root]#

因此当我关闭执行 gdb 命令的文件时问题就解决了。

[root]# gdb -p 2015
(gdb ) p close (4)

执行命令后,文件系统使用率为 25%

谢谢

相关内容