linux 系统中已删除但未释放空间的文件所在进程
嘿,各位 Linux 玩家和系统管理员们!在 Linux 的世界里,文件操作那是家常便饭。创建、写入、删除,行云流水。但你有没有遇到过这样的“灵异事件”:明明一个文件你已经用 rm 命令删掉了,但是磁盘空间却没释放?或者一个重要的日志文件你删了,结果应用还在往里写,导致你永远看不到最新的日志?
别慌,这不是什么灵异事件,这背后其实藏着 Linux 文件系统的一个“小秘密”,而我们要请出今天的主角——lsof | grep deleted 这对黄金搭档,来帮我们把这些“阴魂不散”的文件揪出来!
文件的“生死观”:你以为的删除不是真的删除?
在 Linux 中,当你执行 rm 命令删除一个文件时,你以为文件就“灰飞烟灭”了?Too young, too simple! 事实上,rm 命令只是断开了文件系统中的一个硬链接(或者说,它只是删除了文件在目录树中的“名字”)。
如果这个文件正在被某个进程打开(比如一个应用程序正在写入日志文件,或者一个服务正在读取配置文件),那么即使你删除了它的名字,文件本身在磁盘上占用的空间并不会立即释放!它还会继续存在,直到所有打开它的进程都关闭了对它的引用,它的“引用计数”归零,系统才会真正地回收这块空间。
用个不太恰当的比喻:你家门口的门牌号(文件名)被拆了,但你(进程)还在屋里待着呢,房子(文件内容和占用的空间)肯定还在那儿。只有等你搬出去了,房子才能被收走。
“幽灵文件”的危害
这些“被删除但仍在占用空间”的文件,我们通常称之为**“幽灵文件”或“僵尸文件”**(虽然它不是真正的僵尸进程)。它们可能带来的麻烦可不小:
-
磁盘空间被无形吞噬: 尤其是那些很大的日志文件或者临时文件,一旦被删除但仍被占用,会悄无声息地吃掉你的宝贵磁盘空间,直到系统报警。
-
应用行为异常: 当你尝试查看或重启服务时,发现日志文件没了,但服务还在往里写。这会导致你无法通过正常途径查看最新的日志,给排查问题带来困扰。
-
资源泄漏: 长时间运行的进程如果不断打开并删除文件,又不释放引用,可能导致文件句柄泄漏或磁盘空间耗尽。
lsof | grep deleted:揪出“真凶”的利器!
现在,是时候请出我们的福尔摩斯组合了!
-
lsof:List Open Files 的缩写,它能列出当前系统上所有进程打开的文件。这个命令非常强大,能告诉你哪个进程打开了哪个文件,文件的类型,以及文件在磁盘上的位置等等。 -
grep deleted:这是一个过滤命令,它会从lsof的输出中筛选出包含“deleted”关键字的行。而lsof在显示那些“名字已被删除但仍被进程占用”的文件时,就会在文件路径后面加上(deleted)标识。
所以,当这两个命令结合起来:
Bash
lsof | grep deleted
你就能清晰地看到那些已经被你“删除”了名字,但还在被某个进程“霸占”着的文件!
实战演练(及输出解析)
我们来模拟一个场景。假设我们有一个程序 my_app,它正在写入一个日志文件 /var/log/my_app.log。
-
程序正在写入:
my_app进程打开并写入/var/log/my_app.log。 -
你手贱删了它:
rm /var/log/my_app.log -
运行
lsof | grep deleted:
你可能会看到类似这样的输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
my_app 12345 root 4w REG 253,0 1234567 12345678 /var/log/my_app.log (deleted)
输出解析:
-
COMMAND: 正在使用这个文件的命令或进程名 (my_app)。 -
PID: 进程的 ID (12345)。 -
USER: 运行该进程的用户 (root)。 -
FD: 文件描述符(File Descriptor)。4w表示文件描述符是 4,w代表它以写入(write)模式打开。如果是r就是读取(read)。 -
TYPE: 文件类型 (REG表示常规文件)。 -
DEVICE: 文件所在设备的主/次设备号。 -
SIZE/OFF: 文件大小或文件偏移量。 -
NODE: 文件的 inode 号(在文件系统中唯一标识一个文件)。 -
NAME: 文件的路径和名称。最关键的是后面的(deleted),它明确告诉你:这个文件名字被删了,但还在被占用!
找到“真凶”后,如何“制服”它们?
既然已经找到了“幽灵文件”和“霸占”它的进程,那么解决办法就简单了:
-
重启相关服务/进程: 这是最常见也是最有效的方法。找到那个
COMMAND对应的服务或应用,执行重启操作。例如,如果my_app是一个服务,你可能需要systemctl restart my_app或service my_app restart。服务重启后,它会关闭对旧文件的引用,并通常会重新创建新的日志文件。 -
杀掉进程: 如果重启服务不方便,或者是个一次性进程,你可以直接使用
kill -9 PID命令来强制终止那个进程(这里的PID就是你lsof查到的进程 ID)。但请注意,kill -9是一个强行终止,可能会导致数据丢失或状态不一致,所以通常作为最后的手段。 -
等待进程自行结束: 如果你确定这个进程很快就会完成它的任务并退出,那么也可以选择等待。当进程自然退出后,它对文件的引用也会随之释放。
总结:文件清理的“小技巧”
lsof | grep deleted 是一个非常实用的命令组合,它能帮你快速定位 Linux 系统中那些“名存实亡”却仍在占用资源的幽灵文件。在进行磁盘空间清理、排查日志问题,或者调试应用行为时,别忘了用上这对利器。
记住 Linux 文件系统的这个特性:文件的删除是“软删除”,只有当所有进程都放手后,它才会被“硬删除”并释放空间。了解了这一点,你就能更深入地理解 Linux 的文件管理机制,成为一个更“懂行”的 Linux 用户!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)