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 {} \;