Linux文件删除原理及案例分析

谨记: 大多数服务在运行时,是不能删除对应的服务正在写入的日志文件,会带来意料之外的结果!!!

    Linux是通过link的数量来控制文件删除的,link包括被调用的数量硬链接数量。

    真正的删除一个文件,只有在文件未被进程调用的情况下,删除该文件的所有硬链接数即可。

    如果在进程调用时,通过rm命令删除一个文件,是无法彻底删除的,该文件依然存在,只不过通过ls命令无法看到而已!

案例: 删除进程正在调用的/var/log/secure文件

[root@t-c6 ~]# ls /var/log/secure
/var/log/secure
[root@t-c6 ~]# \rm -rf  /var/log/secure
[root@t-c6 ~]# ls /var/log/secure
ls: 无法访问/var/log/secure: 没有那个文件或目录

    通过命令lsof可以看到,该文件并未彻底删除,因为系统进程正在写入数据到该文件中,进程调用数不为零导致的!

[root@t-c6 ~]# lsof | grep deleted
rsyslogd    917   root    2w      REG              252,1  5573745      41014 /var/log/secure (deleted)

如何解决该问题?

    重启对应的服务

[root@t-c6 ~]# /etc/init.d/rsyslog restart
关闭系统日志记录器:                                       [确定]
启动系统日志记录器:                                       [确定]

    将来有一天发现磁盘block满了,通过du -sh /* | grep G,并未发现太大的文件,可能是删除了不该删除的文件,导致文件大小一直增长,导致block满了,可通过 # lsof | grep deleted 查看 

只有进程调用数为0并且硬链接数为0,该文件才能彻底删除! 

注:我使用的系统为CentOS release 6.9 (Final) 

猜你喜欢

转载自my.oschina.net/u/3285916/blog/1622198