起因是最近老有小伙伴反馈,怎么博客又打不开了?而我进入监控页面一看,硬盘动不动就爆满,一开始我以为博客程序报错,产生了很多日志,于是乎开启了 WordPress Dbug 进行一一排查,一个个解决之后发现仍旧大量占用磁盘。


鼠标指着一看,居然还有阿里云盾的事儿,看来事情不简单。
从进程来看,monitor 和 rsyslogd 大量的磁盘读写,那应该就是日志文件的读写了,进入/var/log目录一看,journal 文件夹磁盘占用高达 4G,而我的阿里云服务器一共才 40G 空间。
先查看报错最多的服务,统计一下哪个服务产生的日志最多,进入 SSH,使用命令:
sudo journalctl -q --no-pager | awk '{print $5}' | cut -d'[' -f1 | sort | uniq -c | sort -rn | head -10
命令解析
sudo journalctl -q --no-pager- 作用:读取系统所有的二进制日志。
-q:安静模式,不显示“日志开始于…”之类的提示头。--no-pager:不分页,一次性输出所有内容(方便后面处理)。
awk '{print $5}'- 作用:提取每一行日志的第 5 列。
- 在标准的系统日志格式中,第 5 列通常是进程名(例如
sshd[1234])。
cut -d'[' -f1- 作用:清洗进程名。
- 因为日志里的进程名通常带着 PID(如
sshd[21373]),这个命令以[为分隔符,只保留前面的名字(即sshd),去掉后面的数字。
sort- 作用:排序。
- 把相同的进程名排在一起,为统计做准备。
uniq -c- 作用:去重并计数。
- 统计每个进程名出现了多少次。
sort -rn- 作用:反向排序。
- 按照数量从大到小排列,让“罪魁祸首”排在最上面。
head -10- 作用:只看前 10 名。
这里只列出前两个最多的日志:
1524148 sshd
650529 monitor
好家伙,SSH 服务产生了150 多万条日志,每一条 Failed password 都是一次硬盘写入。于是我赶紧把 Fail2Ban 给安装上去。晚点把 SSH 端口给改了,如果平时不用,直接去阿里云控制面板把 22 端口都给禁了。
还有一个名为 monitor 的进程产生了 65 万条日志。根据之前的排查,这是宝塔面板的监控程序 (/www/server/monitor/monitor)。缙哥哥在部署宝塔的时候,做了告警通知,但因为邮件服务(163每天发送的数量有限),导致发送失败,程序陷入死循环,疯狂报错写入日志。
结论
也就是这两个B玩意相辅相成,SSHD 爆破日志大量占用磁盘读写,以至于磁盘占用过多,并且导致负载过高。而磁盘占用过多(超过90%)和负载过高(每5分钟内平均负载超过80%)就会自动发送告警邮件。
写在最后
/var/log/journal 是 systemd-journald 服务的二进制日志存储目录。它是导致我服务器磁盘空间爆满的头号元凶(小小的40G磁盘空间占用了4G)。好消息是这个目录里的文件是可以安全清理的,因为它们只是“运行日志”,删掉不会影响系统运行,但是直接删除又因为 journald 服务正在占用它们,直接删可能删不掉或者服务报错。
sudo journalctl --vacuum-size=100M
保留最近 100MB 的日志,其余全部删除。

最后把/etc/systemd/journald.conf文件改下,免得后面又一堆的日志。
# 限制日志文件最大为 200MB
SystemMaxUse=200M
# 如果日志超过 100MB,就触发清理
SystemKeepFree=100M
编辑journald.conf文件,把这两条的参数前#去掉,设置一个值即可,可以根据自己的需求进行设置。
好了,服务器终于恢复正常了。

缙哥哥







![缙哥哥常用运行库下载汇总[2019.1更新]](https://img.dujin.org/images/windowsyunxingku.jpg)






