(这个问题涉及类似的问题,但它讨论的是轮换的日志文件。)
今天我收到一条关于/var
空间非常低的系统消息。
像往常一样,我执行了行中的命令,sudo apt-get clean
只是稍微改善了场景。然后我删除了旋转的日志文件,这再次提供了很少的改进。
经过检查,我发现其中的一些日志文件/var/log
已经变得非常大。具体来说,ls -lSh /var/log
给出,
total 28G -rw-r----- 1 syslog adm 14G Aug 23 21:56 kern.log -rw-r----- 1 syslog adm 14G Aug 23 21:56 syslog -rw-rw-r-- 1 root utmp 390K Aug 23 21:47 wtmp -rw-r--r-- 1 root root 287K Aug 23 21:42 dpkg.log -rw-rw-r-- 1 root utmp 287K Aug 23 20:43 lastlog
正如我们所看到的,前两个是有问题的。我有点惊讶为什么没有轮换这么大的文件。
所以我该怎么做?简单地删除这些文件然后重新启动?还是采取一些更谨慎的步骤?
我正在使用 Ubuntu 14.04。
更新 1
首先,该系统只有几个月的历史。几个月前硬盘崩溃后,我不得不从头开始安装系统。
现在,按照此答案中的建议,我首先使用检查了有问题的日志文件tail
,这并不奇怪。然后,为了进行更深入的检查,我从同一个答案执行了这个脚本。
for log in /var/log/{syslog,kern.log}; do
echo "${log} :"
sed -e 's/\[[^]]\+\]//' -e 's/.*[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}//' ${log} \
| sort | uniq -c | sort -hr | head -10
done
这个过程花了几个小时。输出在一行中,
/var/log/syslog : 71209229 Rafid-Hamiz-Dell kernel: sda3: rw=1, want=7638104968240336200, limit=1681522688 53929977 Rafid-Hamiz-Dell kernel: attempt to access beyond end of device 17280298 Rafid-Hamiz-Dell kernel: attempt to access beyond end of device 1639 Rafid-Hamiz-Dell kernel: EXT4-fs warning (device sda3): ext4_end_bio:317: I/O error -5 writing to inode 6819258 (offset 0 size 4096 starting block 54763121030042024) <snipped> /var/log/kern.log.1 : 71210257 Rafid-Hamiz-Dell kernel: attempt to access beyond end of device 71209212 Rafid-Hamiz-Dell kernel: sda3: rw=1, want=7638104968240336200, limit=1681522688 1639 Rafid-Hamiz-Dell kernel: EXT4-fs warning (device sda3): ext4_end_bio:317: I/O error -5 writing to inode 6819258 (offset 0 size 4096 starting block 954763121030042024)
(/dev/sda3
是我的主目录。我们可以找到,
lsblk /dev/sda NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 931.5G 0 disk ├─sda1 8:1 0 122.1G 0 part / ├─sda2 8:2 0 7.6G 0 part [SWAP] └─sda3 8:3 0 801.8G 0 part /home
为什么一个进程会想要写超出限制实际上超出了我的理解范围。如果即使在系统更新后这种情况仍然存在,也许我会想在这个论坛上问一个不同的问题。)
然后,从这个答案(你可能想检查这个以获得更深入的理解),我执行了,
sudo su -
> kern.log
> syslog
现在,这些文件的大小为零。系统在重启前后运行良好。
我将在接下来的几天内查看这些文件(以及其他文件),并在
它们表现异常时进行报告。
最后一点,有问题的文件 (kern.log
和syslog
) 都设置为轮换,如检查grep
内部文件 ( helped )
/etc/logrotate.d/
所示。
更新 2
日志文件实际上是轮换的。看起来大尺寸是在一天内完成的。
不可以。清空它们但不要使用
rm
,因为它可能会在您键入touch
重新创建它的命令时导致崩溃。最短的方法:
如果不是 root,则需要
sudo
. 取自 AU的另一个答案。在你这样做之前。做一个
tail {logfile}
检查是否有理由让它们变得如此之大。除非这个系统已经有好几年了,否则应该没有理由这样做,解决问题总比让它继续下去要好。kern.log 和 syslog 通常都不会那么大。但就像我说的:如果这个系统运行了很多年,它可能是正常的,只需要清除文件。
并防止它在未来变得那么大: setup
logrotate
。它非常简单,当它变得比您设置的大小时会压缩日志文件。1 另一件事:如果您不想删除内容,您可以通过 tarring 或 gzipping 来压缩文件。这将使您最终得到的文件可能只有现在的 10%。也就是说,如果磁盘上仍有空间可以执行此操作。
可能值得尝试确定填充日志的内容 - 通过简单地使用
less
ortail
命令直观地检查它们或者如果有问题的线路埋得太深而无法轻易看到发生了什么,比如
(注意:考虑到如此大的文件,这可能需要一些时间)这将尝试去除时间戳,然后计算最常出现的消息。
我清理系统日志文件的方法是这样的。步骤 1 和 2 是可选的,但有时您需要检查较旧的日志,备份有时很有用。;-)
可选:复制日志文件
可选:对日志副本使用 Gzip
使用 /dev/null 来清理文件
我们为此日志(仅在几台服务器上)使用 logrotate 并每周通过 cron 脚本执行,所有带有 *.1(或下一个旋转)的文件都通过 gzip 压缩。
我今天安装了 Ubuntu 16.04,我发现了同样的问题。但是,我用 busybox-syslogd 解决了这个问题。是的!我刚刚安装了那个包,问题已经解决了。:)
安装该软件包后,重置
syslog
并kern.log
:我希望这个简单的解决方案对周围的其他人有用。