Linux服务器硬盘空间清理实战

运维服务器时,磁盘满了是个常见问题。当硬盘占用率超过80%,就该动手清理了。这里整理了我实际用到的命令和方法。

先看磁盘用了多少

1
df -h

输出示例:

1
2
3
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1 20G 18G 2.0G 90% /
/dev/sdb1 100G 30G 70G 30% /data

重点关注使用率高的分区,90%那根分区就是重点清理对象。

查看具体哪个目录占空间:

1
2
# 看根目录下各文件夹大小
du -h --max-depth=1 / | sort -hr

找大文件

查找超过100MB的文件:

1
find / -size +100M -type f 2>/dev/null

参数说明:

  • -size +100M:大于100MB
  • -type f:只找文件,跳过目录
  • 2>/dev/null:屏蔽权限错误提示

查找大日志文件:

1
find /var/log -name "*.log" -size +50M

清理时的注意事项

重要:删之前确认是什么文件,别手快删了重要数据。

可以直接删的静态文件

1
rm -rf /path/to/large-file

这类文件通常可以删:

  • 过期的备份包
  • 下载的临时安装包
  • 旧版本程序
  • 归档的过期日志

不能删只能清空的动态日志

Nginx、MongoDB这些服务正在写的日志文件,不能直接删,因为进程还占用着文件句柄,删了也不会释放空间。正确的做法是清空内容:

1
2
echo "" > /var/log/mongodb/mongod.log
echo "" > /var/log/nginx/access.log

或者用 truncate:

1
truncate -s 0 /var/log/mongodb/mongod.log

常见日志清理

Nginx 日志

1
2
# 清空访问日志
echo "" > /var/log/nginx/access.log

MongoDB 日志

1
echo "" > /var/log/mongodb/mongod.log

MongoDB 可以配置日志轮转,在配置文件里加:

1
2
3
systemLog:
logRotate: reopen
logAppend: true

系统日志

1
2
sudo truncate -s 0 /var/log/syslog
sudo truncate -s 0 /var/log/auth.log

自动化清理方案

logrotate 配置

1
2
3
4
5
6
7
8
9
10
11
12
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 user group
postrotate
/usr/bin/killall -HUP myapp
endscript
}

crontab 定时任务

1
2
# 每天凌晨2点清空MongoDB日志
0 2 * * * echo "" > /data/log/mongodb/mongod.log

监控脚本

简单的磁盘监控脚本:

1
2
3
4
5
#!/bin/bash
USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $USAGE -gt 80 ]; then
echo "磁盘使用率已达 ${USAGE}%,请及时处理" | mail -s "服务器磁盘告警" admin@example.com
fi

磁盘规划建议

  • /var/log 单独分区,避免日志占满根分区
  • 数据库文件放在独立分区
  • 预留至少20%的空闲空间

总结几个原则:定期检查(df -h)、安全清理(先确认再删)、自动化管理(logrotate + crontab)、提前规划(分区分离)。