概述

在发现公司业务环境磁盘空间不足的情况下使用rm命令删除占用的日志或无用文件后发现存储空间未得到释放。

[root@localhost fd]# df -Th
文件系统    类型      容量  已用  可用 已用%% 挂载点
/dev/sda9     ext4    375G  176G  180G  50% /
tmpfs        tmpfs     32G   72K   32G   1% /dev/shm
/dev/sda1     ext4    194M   33M  152M  18% /boot
/dev/sda2     ext4    9.9G  151M  9.2G   2% /home
/dev/sda3     ext4    9.9G  151M  9.2G   2% /opt
/dev/sda5     ext4    9.9G  151M  9.2G   2% /tmp
/dev/sda6     ext4    9.9G  5.3G  4.2G  57% /usr
/dev/sda7     ext4    9.9G  2.0G  7.5G  21% /var
/dev/mapper/data01
              ext3   1008G  907G   51G  95% /data01
/dev/mapper/data03
              ext3   1008G   35G  922G   4% /data03

在通过lsof来查看哪些进程占用的已删除文件,发现进程Pid3921占用着已经删除的文件。重启服务可以立即释放存储空间但生产环境中并不能进行这个操作。

[root@localhost ~]# lsof |grep deleted
java       3921   collect   39w      REG              253,0  22524756391   41885497 /data01/test/tmpPath/test.dat (deleted)
....
推荐的清理磁盘空间方式

使用>方式清空文件内容达到释放目的

解决办法

可以在进程的/proc/3921/fd下看到很多文件占用的链接,通过命令可以获取哪些已删除但仍在占用的fd id。

[root@localhost fd]# lsof -p 3921 -a +c 15|grep deleted |awk '{print $4}' |sed -r 's/[a-z]//g'
39
56
78
101
104
110
228
258
306
344
368
374
393
446
487
546
577
589
626
648

通过命令生成手动删除的命令,再手动执行清理。

[root@localhost ~]# lsof -p 3921 -a +c 15|grep deleted |awk '{print $4}' |sed -r 's/[a-z]//g'|xargs -i echo "> /proc/3921/fd/{}"

> /proc/3921/fd/39
> /proc/3921/fd/56
> /proc/3921/fd/78
> /proc/3921/fd/101
> /proc/3921/fd/104
> /proc/3921/fd/110
> /proc/3921/fd/228
> /proc/3921/fd/258
> /proc/3921/fd/306
> /proc/3921/fd/344
> /proc/3921/fd/368
> /proc/3921/fd/374
> /proc/3921/fd/393
> /proc/3921/fd/446
> /proc/3921/fd/487
> /proc/3921/fd/546
> /proc/3921/fd/577
> /proc/3921/fd/589
> /proc/3921/fd/626
> /proc/3921/fd/648

分类: Linux