在发现公司业务环境磁盘空间不足的情况下使用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% /data0
在通过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
]]>