Linux大文件已删除,但df查看已使用的空间并未减少

本文介绍了解决Linux系统中磁盘使用率显示异常的问题,通过lsof命令检查已删除文件仍被进程占用的情况,并提供了具体的解决方案。

百度问题:Linux里,df发现/分区使用80%多,后删除大部分文件,再使用df查看使用情况,显示内容不变,是为什么?

在网上查了下,好像说是inode的原因,还没真正删除,可是都知说了原因,没有说解决办法,我想知道怎么解决,让df显示目前磁盘实际的使用情况!

解决办法:

 lsof|grep deleted

           进程号      fd号

mfsmount  13124    root  txt       REG              104,3       160760    1368696 /var/tmp/portage/sys-cluster/moosefs-1.6.26/image/usr/bin/mfsmount (deleted)

syslog-ng 14142    root    7w      REG              104,3 192380776055       7104 /var/log/messages (deleted)

python2.6 21550    root    0u      CHR              136,0          0t0          2 /dev/pts/0 (deleted)

php-fpm   30315    root    3u      REG              104,3            0     659057 /tmp/.xcache.0.0.1718328763.lock (deleted)

php-fpm   30315    root    4u      REG              104,3            0    1236916 /tmp/.xcache.0.1.440168404.lock (deleted)

php-fpm   30315    root    5u      REG              104,3            0    1368672 /tmp/.xcache.0.2.300103481.lock (deleted)

php-fpm   30316  nobody    3u      REG              104,3            0     659057 /tmp/.xcache.0.0.1718328763.lock (deleted)

php-fpm   30316  nobody    4u      REG              104,3            0    1236916 /tmp/.xcache.0.1.440168404.lock (deleted)

php-fpm   30316  nobody    5u      REG              104,3            0    1368672 /tmp/.xcache.0.2.300103481.lock (deleted)

php-fpm   30318  nobody    3u      REG              104,3            0     659057 /tmp/.xcache.0.0.1718328763.lock (deleted)

php-fpm   30318  nobody    4u      REG              104,3            0    1236916 /tmp/.xcache.0.1.440168404.lock (deleted)

php-fpm   30318  nobody    5u      REG              104,3            0    1368672 /tmp/.xcache.0.2.300103481.lock (deleted)

php-fpm   30319  nobody    3u      REG              104,3            0     659057 /tmp/.xcache.0.0.1718328763.lock (deleted)

 

这里可以看出syslog-ng 占用了192G的磁盘空间,并且咱们已经把/var/log/messages删除了,但这个进程未结束。

我本来是先用的kill 就达到了这种效果,最后才想起来可能把syslog-ng服务重启一下这才是最好的。

# /etc/init.d/syslog-ng restart

如果重启服务发现df的Usage值未减少,那就把它狠心的杀死吧!

# kill -9 14142

 

### 文件删除后磁盘空间未释放的原因及解决方法 在Linux系统中,文件被删除后磁盘空间未释放的现象可能由多种原因引起。以下是具体的原因分析及解决方法。 #### 1. **核心原因** 当文件被进程持续占用时(例如日志文件正在被写入),直接执行`rm`命令仅会删除文件的索引节点(inode),但磁盘块仍然被进程锁定,导致空间未被释放[^2]。 #### 2. **确认空间占用的真实状态** 可以通过以下步骤检查磁盘空间是否被正确释放: - 使用`df -h`命令查看磁盘整体使用情况。 - 使用`du -sh /path/to/directory`计算目录的实际大小。 - 如果`df`和`du`的结果差异显著,则说明存在未释放的空间。 #### 3. **定位被占用的已删除文件** 通过以下命令查找所有被标记为`deleted`且仍被进程占用的文件: ```bash lsof +L1 | grep deleted ``` 或者指定路径进行筛选: ```bash lsof /path/to/directory | grep deleted ``` 输出示例: ``` java 1234 root 5r REG 8,3 10G 1234567 /var/log/app.log (deleted) ``` 上述输出表示进程ID为`1234`的程序占用了已被删除的日志文件`/var/log/app.log`,且该文件大小为10GB。 #### 4. **释放空间的操作选择** 根据实际情况选择以下方法之一: - **终止占用进程** 根据PID终止进程(需评估业务影响): ```bash kill -9 1234 ``` - **清空文件内容(无需终止进程)** 通过文件描述符清空内容(保留文件句柄): ```bash echo "" > /proc/1234/fd/5 ``` 其中`5`是`lsof`输出中的FD列数值。 #### 5. **批量处理脚本** 对于多进程占用的情况,可以生成批量终止进程的脚本: ```bash lsof | grep deleted | awk '{print "kill -9 " $2}' > kill_script.sh chmod +x kill_script.sh && ./kill_script.sh ``` #### 6. **预防措施** - **避免直接删除被写入中的文件** 日志类文件应通过`truncate`或`echo "" > file`清空内容,而不是直接删除。推荐使用`logrotate`工具配置日志轮转策略。 - **监控与告警** 周期性检查`df`与`du`的差值,设定阈值触发警报。可以部署监控工具(如Prometheus)跟踪inode和磁盘块状态。 #### 7. **特殊情况处理** 如果上述方法无效,考虑重启相关服务或操作系统(谨慎操作),以强制解除所有文件锁定。 --- ### 注意事项 在实际操作中,建议优先尝试清空文件内容的方法,避免因直接终止进程导致业务中断。同时,定期清理不必要的大文件并优化日志管理策略,可有效减少类似问题的发生。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值