服务器磁盘满了怎么办:Linux 磁盘占用排查与清理实战
服务器跑着跑着突然报“No space left on device”,网站挂了、日志写不进去,这种情况很多运维都遇到过。本文按“先定位、再清理、最后预防”的顺序,把磁盘占满的排查和处置流程走一遍。
## 一、先看整体占用
```bash
df -h
```
重点看 Use% 接近 100% 的分区。注意 `/` 根分区和 `/var`、`/home` 这些独立挂载点要分开看,很多时候只是某个小分区满了。
## 二、定位大目录
```bash
du -sh /* 2>/dev/null | sort -hr | head -10
du -sh /var/* 2>/dev/null | sort -hr | head -10
```
逐层向下钻,很快能锁定具体目录。`du` 加 `2>/dev/null` 可以屏蔽无权限的报错噪音。
## 三、几种“看不见”的占用
**1. 已删除但被进程占用的文件**
```bash
lsof | grep deleted
```
日志被 rm 了但进程还持有句柄,空间不会释放。重启对应进程或 `kill -HUP` 即可回收。
**2. 日志文件暴涨**
```bash
find /var/log -type f -size +500M -exec ls -lh {} \;
```
常见元凶是 nginx access.log、应用日志、系统 journal:
```bash
journalctl --vacuum-size=200M
truncate -s 0 /var/log/nginx/access.log
```
注意:用 `truncate` 清空正在写的日志是安全的,直接 `rm` 反而可能让进程继续往已删除的文件句柄写,空间不释放。
**3. Docker 垃圾**
```bash
docker system df
docker system prune -a --volumes
```
镜像层、停止的容器、悬空 volume 往往能清出好几个 G。
## 四、安全清理清单
- `/var/log` 下历史日志、压缩包(保留最近 7 天)
- `/tmp` 超过 7 天未访问的文件
- 包管理缓存:`apt clean` 或 `yum clean all`
- 旧内核:保留当前运行版本,其余可删
- 数据库 binlog:确认备份后在 MySQL 中 `PURGE BINARY LOGS`
清理前务必确认文件用途,尤其不要随手删 `/var/lib` 下的数据目录。
## 五、预防:让磁盘不再失控
```bash
# 1. 给关键日志加 logrotate
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
copytruncate
}
```
```bash
# 2. 加磁盘监控告警(crontab 每10分钟检查)
*/10 * * * * df -h / | awk 'NR==2 {gsub("%","",$5); if ($5>85) print "disk high"}'
```
```bash
# 3. 配好日志切割 + 定期清理临时文件
find /tmp -type f -mtime +7 -delete
```
## 总结
磁盘满的处理顺序是:`df` 看分区 → `du` 找目录 → `lsof` 查被占用文件 → 针对性清理 → logrotate 和监控兜底。大部分情况下半小时内能恢复,关键是别在没确认文件用途时直接 rm。
- 点赞
- 收藏
- 关注作者
评论(0)