【运维救火】服务器磁盘满了?教你3招快速定位“空间杀手”并清理

简介: 当磁盘写满时,别慌!本文提供一套标准化排查流程:先用 `df -h` 定位问题磁盘,再用 `du` 命令层层深入找出大文件;清理时推荐清空而非删除日志,避免句柄泄露。若空间未释放,可用 `lsof | grep deleted` 查找被占用的文件并重启对应服务。四步冷静救火,快速恢复系统稳定。

前言

“No space left on device” —— 这大概是所有后端开发和运维最不想看到的报错之一。

当磁盘写满时,MySQL 可能会崩溃,日志无法写入,甚至 Tab 键补全都会失效。很多人的第一反应是:“完了,快删点东西!”但如果不知道谁占用了空间,盲目删除可能会导致更严重的系统故障。

今天我们来分享一套标准化的磁盘清理流程,助你在危急时刻冷静救火。

第一步:宏观定位——是哪块磁盘满了?

首先,我们需要知道是系统盘(/)满了,还是数据盘(/data)满了。 使用 df 命令(Disk Free):

Bash

# -h 代表 human-readable,以 G, M 为单位显示
df -h

输出示例:

Plaintext

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   38G  2.0G  95% /
devtmpfs        3.9G     0  3.9G   0% /dev
/dev/vdb1       100G   20G   80G  20% /data

分析:很明显,根目录 / 下的 /dev/vda1 使用率达到了 95%,是它出了问题。

第二步:精准打击——谁吃掉了我的空间?

知道是根目录满了,但根目录下文件夹那么多,总不能一个个 ls 去看吧? 我们需要用到 du 命令(Disk Usage)。

这里教大家一个**“黄金组合命令”**,能快速找出当前目录下最大的前10个文件夹:

Bash

# 切换到根目录(或者你发现满的那个挂载点)
cd /
# 查找当前目录下各个文件夹的大小,并按大到小排序,显示前10个
du -h --max-depth=1 | sort -hr | head -n 10

命令解析:

  • du -h --max-depth=1:只统计当前目录下一级子目录的大小,不递归显示所有文件。
  • sort -hr:按人类可读的数字格式(human-readable)逆序(reverse)排序。
  • head -n 10:只看前10名。

输出示例:

Plaintext

38G     .
15G     /var
10G     /usr
8.5G    /home
...

排查思路:发现 /var 目录巨大。好的,进入 /var,再次执行上面的组合命令。cd /var -> 执行命令 -> 发现 /var/log 巨大。cd /var/log -> 执行命令 -> 发现 catalina.out 或者 access.log 有几十个G。找到了!罪魁祸首就是它!

第三步:清理策略——删还是清空?

找到大日志文件后,不要急着 rm

1. 较安全的做法:清空文件内容

如果你直接删除正在被程序(如Tomcat或Nginx)写入的日志文件,可能会导致文件句柄丢失,或者程序报错。 更稳妥的做法是清空文件

Bash

# 将空内容重定向到日志文件中
echo "" > huge_log_file.log

这样做,文件大小瞬间变为0,且不需要重启服务。

2. 如果一定要删除

确认文件不再需要后,可以使用 rm 删除。但在删除 *.tar.gz 等备份文件时要小心。

隐藏关卡:为什么删了文件,空间却没释放?

这是很多新手的噩梦。 明明把 20G 的 access.log 删除了,再用 df -h 一看,磁盘占用率还是 95%!

原因:该文件正在被某个进程(比如 Nginx)打开。虽然你在文件系统中删除了文件名,但Linux内核认为该文件被进程占用,实际上并没有释放磁盘块。

解决办法:

  1. 查找“死而不僵”的文件:
    Bash
# 查找已被删除但仍被进程占用的文件
lsof | grep deleted
  1. 如果提示 -bash: lsof: command not found,请先 yum install lsof
  2. 释放空间:
  • 方法A(推荐): 重启占用该文件的服务(如 systemctl reload nginx)。重启后句柄释放,空间就回来了。
  • 方法B(暴力): 根据 lsof 结果中的 PID,杀掉进程(kill -9 PID)。

总结

遇到磁盘报警不要慌:

  1. df -h 看挂载点。
  2. du -h --max-depth=1 | sort -hr | head -n 10 层层定位大文件夹。
  3. 优先使用 echo "" > file 清空日志。
  4. 删了没释放?用 lsof | grep deleted 查进程并重启服务。
相关文章
|
弹性计算 Shell 网络安全
因为 /usr/bin/dbus-daemon 共享库文件引发的系统启动异常
因为 /usr/bin/dbus-daemon 共享库文件引发的系统启动异常
|
安全
如何查询阿里云账号uid?
阿里云账号UID查询方法
6335 0
如何查询阿里云账号uid?
|
5月前
|
微服务 监控
认识Seata
Seata是阿里巴巴开源的分布式事务解决方案,通过事务协调者(TC)、事务管理器(TM)和资源管理器(RM)协同工作,实现全局事务一致性。支持XA、AT、TCC、SAGA四种模式,其中AT为默认模式,具备最终一致性与低侵入性,广泛应用于微服务架构中。
认识Seata
|
5月前
|
缓存 Java Docker
【Docker实战】如何写出“性感”的Dockerfile?从1GB瘦身到100MB的秘籍
本文介绍如何编写高效、安全的Dockerfile,以Java和Python为例,分享四大核心技巧:多阶段构建减小镜像体积,利用缓存加速构建,选用轻量基础镜像,配置.dockerignore忽略无用文件。助你打造小巧、快速、安全的容器镜像,提升部署效率与安全性。
|
5月前
|
安全 Linux Shell
【Linux进阶】拒绝Permission denied!彻底搞懂chmod与chown文件权限
本文深入解析Linux权限管理核心命令`chmod`与`chown`,教你读懂`ls -l`输出,掌握数字权限(如755、644)的含义与应用场景,理解属主与属组的作用,强调最小权限原则,拒绝滥用`chmod 777`,保障服务器安全。
|
5月前
|
安全 Java 应用服务中间件
认识SpringSecurity
Spring Security 是基于过滤器链的全面安全框架,支持多种认证方式(如OAuth2、JWT等)与细粒度授权控制,具备强大且灵活的安全防护能力。
|
6月前
|
边缘计算 自然语言处理 算法
实时交互数字人端到端延迟压至0.8秒:关键技术节点与商业价值解析
0.8秒是实时数字人体验的关键阈值,端到端延迟低于此值可实现自然流畅交互。本文解析其技术链路、核心支撑与商业价值,揭示为何这一指标成为数字人从“可用”到“好用”的分水岭。
|
9月前
|
弹性计算 安全 Linux
阿里云服务器ECS安装宝塔Linux面板、安装网站(新手图文教程)
本教程详解如何在阿里云服务器上安装宝塔Linux面板,涵盖ECS服务器手动安装步骤,包括系统准备、远程连接、安装命令执行、端口开放及LNMP环境部署,手把手引导用户快速搭建网站环境。
|
存储 缓存 负载均衡
如何设计一个注册中心?以Zookeeper为例
本文介绍了分布式系统中注册中心的设计与工作原理,重点讲解了Zookeeper作为注册中心的实现。注册中心需具备服务注册、注销、心跳检测、服务查询等功能,确保高可用性。Zookeeper通过层次命名空间和znode存储数据,支持服务注册与发现,并采用发布-订阅模式通知消费者服务变更。然而,Zookeeper存在选举期间不可用的问题,不太适合作为注册中心,因其CP模型优先保证一致性而非可用性。
723 78
|
机器学习/深度学习 自然语言处理 API
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程。通过简单的代码示例,展示如何将文本转换为自然流畅的语音,适用于有声阅读、智能客服等场景。
5274 3

热门文章

最新文章