Linux下deleted的文件导致空间打满定位与解决

来自三线的随记

简述

在linux下,会出现有的文件被删除了,但是空间以及文件句柄未释放的情况,类似的情况还有

  • 文件在另一进程持续写入的情况下被删除了,长时间下会导致系统空间不足

定位及解决

一般这种问题都是在系统爆出空间不足的时候才会被发现

使用 lsof 命令定位具体未释放的文件

其中可以配合参数 L 使用

+L/-L 打开或关闭文件的连结数计算,当+L没有指定时,所有的连结数都会显示(默认);若+L后指定数字,则只要连结数小于该数字的信息会显示;连结数会显示在NLINK列。

A specification of the form ``+L1''  will  select  open files that have been unlinked. 

A specification of the form ``+aL1 <file_system>'' will select unlinked open files on the specified file system.

-L 默认参数,其后不能跟数字,将不显示连结数信息

lsof -n +L1
lsof -nP | grep '(deleted)'
lsof -n +L1 2>&1|grep -i '(deleted)'|sort -rn -k7

其中注意lsof的回显结果中,第7列为文件大小,所以如果是空间不足的情况下,更加关注第七列的结果即可

[root@test-node ~]# lsof -n +L1 | head -n 1
COMMAND     PID USER   FD   TYPE DEVICE  SIZE/OFF NLINK      NODE NAME


在找到相应的大文件以后

cd /proc/$(PID)/fd 切换目录后执行 ls -l 可以找到相应的symbol链接🔗

执行 stat -L $(file_path) 也可以看到相应的文件的实际大小(单位 Byte)

[root@node-1 fd]# lsof +L1|grep deleted|grep log
tuned       6479 root    3w   REG  253,0     1948     0 269037741 /var/log/tuned/tuned.log (deleted)
[root@node-1 fd]# pwd
/proc/6479/fd
[root@node-1 fd]# ls -l 3
l-wx------ 1 root root 64 Oct  8 10:01 3 -> /var/log/tuned/tuned.log (deleted)
[root@node-1 fd]# stat -L 3
  File: ‘3’
  Size: 1948      	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 269037741   Links: 0
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-10-08 10:01:21.159936490 +0800
Modify: 2021-10-08 10:01:21.878773378 +0800
Change: 2021-10-11 10:01:53.699094028 +0800
 Birth: -


之后如果要释放空间的话,可以选择用重定向符(echo > xxxx )或 truncate 等方法置空文件,也可以选择重启相应的进程释放句柄(推荐)

若是误删的文件,可以使用cat或者cp等命令恢复

cat /proc/${pid}/fd/${id} > /tmp/${file_path}

如果需要根据inode删除文件(例如特殊的文件名),可以如下操作:

find . -inum ${inode} -exec rm -i {} \;