当服务器磁盘容量满了(磁盘使用率 100%),可能导致服务异常(如无法写入日志、无法创建文件、程序崩溃等)。排查和处理需遵循 “先定位原因,再安全处理” 的原则,以下是详细流程:

一、排查:定位磁盘满的原因

1. 查看整体磁盘使用情况

首先确认哪个分区满了,使用 df 命令查看各分区使用率:

df -h  # 以人类可读的单位(G/M)显示分区使用情况

输出示例(关注 Use% 列,找到使用率 100% 的分区,如 /dev/sda1):

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda1        50G   50G    0G 100% /

tmpfs           3.9G     0  3.9G   0% /dev/shm

2. 定位占用空间的大目录

针对满的分区(如根目录 /),逐步定位占用空间的目录。使用 du 命令从顶层目录向下排查:

查看根目录下各子目录的大小(需 root 权限,避免权限不足):

du -sh /* 2>/dev/null  # 忽略错误输出,显示根目录下各目录的总大小(-s汇总,-h人类可读)

输出中数值较大的目录(如 /var/home/data)是重点排查对象。

进入大目录,继续深入排查(以 /var 为例):

cd /var

du -sh * 2>/dev/null  # 查看/var下各子目录大小

常见大目录:/var/log(日志)、/var/lib(数据库 / 缓存)、/tmp(临时文件)等。

3. 定位大文件或冗余文件

找到大目录后,进一步定位具体的大文件(通常是占用空间的 “元凶”):

查找单个分区内大于 1G 的文件(以根分区 / 为例):

find / -type f -size +1G 2>/dev/null  # 忽略错误,查找所有大于1G的文件

按大小排序显示前 20 个大文件:

find / -type f -size +100M 2>/dev/null -exec du -sh {} \; | sort -rh | head -n 20

4. 检查特殊情况

已删除但进程仍占用的文件:有时文件被删除,但进程仍在写入(如日志文件),磁盘空间不会释放。需用 lsof 查看:

lsof | grep deleted  # 查找已删除但被进程占用的文件

输出中会显示占用文件的进程 ID(PID),重启对应进程即可释放空间。

分区挂载问题:如果某目录下挂载了新分区,但挂载前该目录已有文件,挂载后原文件会被隐藏,导致 “实际占用空间但看不到”。可先卸载分区(如 umount /mnt),再检查原目录大小。

日志 / 缓存堆积:应用程序(如 Nginx、MySQL)的日志未轮转,或缓存文件(如 /var/cache)未清理,可能持续占用空间。

二、处理:根据原因清理或释放空间

1. 清理无用文件(优先安全操作)

临时文件/tmp 目录下的文件通常可删除(注意:不要删除正在使用的临时文件,可删除几天前的旧文件):

find /tmp -type f -mtime +7 -delete  # 删除7天前的临时文件

旧日志文件/var/log 下的旧日志(如 .gz 压缩的历史日志)若无需保留,可直接删除;正在写入的日志(如 messagesnginx/access.log)不可直接删除,需截断(保留文件但清空内容):

> /var/log/nginx/access.log  # 截断日志文件(安全,不影响进程写入)

建议后续配置日志轮转(如 logrotate),自动压缩 / 删除旧日志。

冗余备份 / 安装包/backup/var/cache/apt/archives(Debian/Ubuntu)或 /var/cache/yum(CentOS)中的旧备份、安装包,确认无用后删除:

rm -f /var/cache/apt/archives/*.deb  # 清理旧deb包

2. 归档或迁移大文件

对于有用但暂时不用的大文件(如历史备份、旧数据),可迁移到其他存储(如外接硬盘、NAS):

# 示例:将大文件迁移到外接硬盘(假设挂载在/mnt/ext_disk)

mv /data/old_backup.tar.gz /mnt/ext_disk/

3. 释放被占用的文件

若排查到 “已删除但进程占用” 的文件,重启对应进程释放空间(需确认进程重启无风险):

# 假设lsof显示PID 1234占用了已删除的文件

kill -HUP 1234  # 平滑重启(如Nginx/Apache),或 kill -9 1234(强制终止,谨慎使用)

4. 调整配置(长期优化)

日志轮转:配置 logrotate 自动轮转日志(如每天 / 每周压缩、保留 30 天),避免日志无限增长。

清理缓存:部分应用的缓存(如 PHP opcode 缓存、浏览器缓存)可手动清理:

# 示例:清理系统页缓存(临时释放空间,不影响数据)

sync && echo 3 > /proc/sys/vm/drop_caches

扩容分区:若磁盘本身容量不足,可通过增加硬盘、扩容分区(如 LVM 逻辑卷)解决(需谨慎操作,建议先备份数据)。

三、预防:避免再次满盘

监控磁盘空间:用 df -h 结合监控工具(如 Prometheus + Grafana),设置阈值告警(如使用率 > 85% 时报警)。

定时清理脚本:通过 crontab 设置计划任务,定期清理临时文件、旧日志(如每天凌晨执行)。

规范文件存储:明确大文件(如备份、视频)的存储路径,避免随意存放在系统分区。

注意事项

操作前备份重要文件,避免误删系统关键文件(如 /bin/lib 下的文件)。

不要直接删除正在写入的文件(如数据库文件、运行中的日志),可能导致应用异常。

若涉及系统分区(如 /),清理时优先保留 binetclib 等系统目录,避免破坏系统运行。

通过以上步骤,可逐步定位并解决服务器磁盘满的问题,同时建立长期管理机制预防复发。

遇到权限问题无法清空日志文件:

使用 truncate 命令(无需直接写入文件)

truncate 命令可直接将文件大小设置为 0,适用于权限受限的场景:

清空文件(需 root 权限)

truncate -s 0 /app/xxl-job-admin-1.8.2/logs/xxl-job-admin.log

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐