Loading... <div class="tip share">请注意,本文编写于 1340 天前,最后修改于 570 天前,其中某些信息可能已经过时。</div> ##### Summary 这篇博客对置空文件和删除文件这两个操作的一个总结,记录一下 ##### 实验 * 测试环境:Ubuntu Server 18.04.5 LTS * 步骤 1. 通过 `echo` 创建一个文件 `test.txt` ,并向其中写入内容 ```bash echo "123" > test.txt ``` ![创建文件](https://cdn.nlark.com/yuque/0/2020/png/242695/1598081578697-5dd8904c-8332-420c-add7-209bdb95a244.png) 2. 使用 `tail` 占用 `test.txt` 文件句柄 ```bash tail -f test.txt ``` ![tail文件](https://cdn.nlark.com/yuque/0/2020/png/242695/1598081635126-e76938c5-b571-4b9e-b9f4-7d7ae5c26bff.png) 此时通过 `lsof` 查看文件句柄占用情况, 可以发现`tail` 是正在占用 `test.txt` 文件句柄的 ```bash lsof test.txt ``` ![lsof查看文件占用](https://cdn.nlark.com/yuque/0/2020/png/242695/1598081739430-a01623cc-d87a-47bd-98ac-8927d9276064.png) 3. 置空文件,通过 `lsof` 观察文件 `test.txt` 状况变化 ```bash > test.txt lsof test.txt ``` ![置空文件1](https://cdn.nlark.com/yuque/0/2020/png/242695/1598081821569-00ab9cca-0ab1-4293-9286-04479e5de6fc.png) ![置空文件2](https://cdn.nlark.com/yuque/0/2020/png/242695/1598081866291-cac0ce74-d4dd-4058-8a8a-7629f64988ea.png) ![置空文件3](https://cdn.nlark.com/yuque/0/2020/png/242695/1598081885218-b5db1b9d-ab63-455e-b7de-f56c402580ad.png) 置空文件会清空文件 `test.txt` 内容,在 `lsof` 中并不会将文件句柄状态更改为 `deleted` ,发生变更的只是 `SIZE` 大小变为0. 4. 删除文件,通过 `lsof` 观察文件状况变化 为了便于对比,现在通过 `echo` 向文件 `test.txt` 追加原内容,恢复原文件状态,然后执行删除操作 ```bash echo "123" >> test.txt rm -rf test.txt ``` ![删除文件1](https://cdn.nlark.com/yuque/0/2020/png/242695/1598082054315-518f4ba4-f1e2-4f37-8907-0ecd83291beb.png) ![删除文件2](https://cdn.nlark.com/yuque/0/2020/png/242695/1598082068194-08f73329-c77c-4cbe-be0e-e12d83bc0cfa.png) ![删除文件3](https://cdn.nlark.com/yuque/0/2020/png/242695/1598082092405-380112e6-9f1a-440b-b6a4-8d0eacb6880f.png) 文件 `test.txt` 删除后,并不能通过 `lsof filename` 方式进行查看文件句柄状态,只能通过 `lsof | grep deleted` 查看 ```bash lsof | grep deleted ``` ![lsof查看文件占用](https://cdn.nlark.com/yuque/0/2020/png/242695/1598082181213-0e6203c9-7a96-4803-8d7f-07dd5daea3e3.png) 可见,当文件被删除,同时进程在占用文件句柄,使用 `lsof`会发现文件句柄被更改为`deleted`。文件会从磁盘上消失,但是不会释放空间。(`SIZE` 大小依然为4) ##### 总结 1. `lsof | grep deleted` 如果出现有deleted的记录,证明有文件被删除。 2. 置空操作不会影响文件句柄状态,只是 `SIZE` 变为0。 3. 置空操作可以在有进程占用文件句柄状态下释放磁盘空间,删除操作只能等待进程释放句柄后才能释放磁盘空间 最后修改:2022 年 10 月 03 日 © 允许规范转载 赞 0 如果对你有帮助,可以请我喝杯奶茶哦