运维服务器时,磁盘满了是个常见问题。当硬盘占用率超过80%,就该动手清理了。这里整理了我实际用到的命令和方法。
先看磁盘用了多少
输出示例:
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
| 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)、提前规划(分区分离)。