一、删除原理
Linux通过link数量控制文件删除的,只有当一个文件i_count和i_link都为0,文件才被删除。
i_count为当前文件被调用的数量(内存引用计数器,被进程调用时增加);
i_link为介质连接数量(磁盘引用计数器,创建硬链接时增加)。
rm删除文件改变的是i_link数。
![](https://i-blog.csdnimg.cn/blog_migrate/467eca10739378a2cfb30d12f6bed607.png)
二、查询方法
1、i_link命令:
查看i_link方法:
ls -ihl
举例:
[root@localhost shell_22_num]# ls -ihl
total 24K
103188844 drwxr-xr-x. 2 root root 6 Feb 1 23:26 directory
103188836 -rw-r--r--. 1 root root 2.4K Jan 31 22:37 num+.sh
103188841 -rw-r--r--. 1 root root 168 Jan 31 22:28 test1.sh
上面三个文件的i_count数量依次为2,1,1。
2、i_count命令:
查看文件被进程调用数情况:
fuser -uv [绝对路径文件名]
查看i_count方法说白了就是确认有哪些进程调用该文件。所以通过查询文件被使用情况便可知晓。-u指在每个进程后显示所属的用户名,-v指详细模式。
举例
[root@localhost shell_22_num]# fuser -uv /opt/shell/sexboy.txt
USER PID ACCESS COMMAND
/opt/shell//sexboy.txt: root 6266 f.... (root)sh
如上,可以看出该文件目前被root用户使用的进程sh调用,PID为6266。
三、文件删除方法
1、删除这个文件所有相关的硬链接 ——删除文件所有的入口
rm -rf [文件名] //所有硬链接及源文件文件
2、这个文件的进程调用数也为0 ——没有进程调用该文件
方法1:
fuser -ukv [绝对路径文件名] //-k代表杀死访问指定文件的所有进程
该方法有一个问题,就是在运行shell脚本(长ping 1000个包)时,使用该命令,成功关闭sh进程却不能取消整个Ping进程。。。我怀疑是我仅仅杀死了运行该ping命令的shell脚本的进程sh,而ping无影响。所以关闭进程方法推荐使用kill命令:
ps -ef|grep ping
kill -9 [进程PID]
方法2:
lsof |grep [文件路径]
lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。
使用该命令后,可以查看到调用该文件的程序名、PID,再通过kill命令关闭即可。
满足:
1、硬链接数=0;
2、进程调用数=0。