闲者博客 - 存储 https://bk1314.com/tag/%E5%AD%98%E5%82%A8/ Linux在不杀进程的情况下释放存储空间 https://bk1314.com/48.html 2022-02-26T23:42:00+08:00 概述在发现公司业务环境磁盘空间不足的情况下使用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