ZBLOG

linux 系统,一个文件已被进程A打开,之后被进程B删除,此时如何确定进程A是哪个?

在 Linux 系统中,如果一个文件被进程 A 打开后又被进程 B 删除(例如通过 rm),该文件仍会占用磁盘空间(直到进程 A 关闭它)。此时可以通过以下方法确定是哪个进程(进程 A)仍在持有这个已删除的文件:


1. 使用 lsof 查找已删除但未释放的文件

命令

  1. sudo lsof +L1

或精确匹配文件名:

  1. sudo lsof | grep -i "deleted" | grep "/path/to/file"

输出示例

  1. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  2. nginx 1234 root 1w REG 8,1 102400 123456 /var/log/app.log (deleted)
  • 关键字段
    • COMMAND/PID:显示持有文件的进程名称和 PID。
    • (deleted):标记文件已被删除但未被释放。
    • FD:文件描述符(如 1w=标准输出以写入模式打开)。

2. 通过 /proc/<PID>/fd/ 确认

如果已知文件名或部分路径,可以遍历所有进程的 fd 目录:

  1. sudo find /proc/[0-9]*/fd -ls | grep -i "deleted" | grep "/path/to/file"

3. 恢复被删除的文件内容

如果需要从持有文件的进程中恢复内容:

  1. # (1)查看进程的 fd 指向的实际 inode
  2. ls -l /proc/<PID>/fd/
  3. # (2)从 fd 复制内容到新文件(假设 fd 号为 3)
  4. cat /proc/<PID>/fd/3 > /tmp/recovered_file

4. 为什么文件被删除后仍占用空间?

  • Linux 的文件系统采用引用计数机制。当进程 A 打开文件时,引用计数+1;rm操作仅减少目录项的引用,但进程 A 仍持有文件的 inode,因此磁盘空间不会释放。
  • 释放条件:只有当所有持有该文件的进程关闭它(或终止)后,空间才会释放。

5.扩展命令

a.统计所有被删除未释放的文件及总大小

  1. sudo lsof | grep deleted | awk '{sum+=$7} END {print sum/1024/1024 " MB"}'

b.强制清理已删除的大文件

若需主动释放空间,可重启相关进程或手动终止:

  1. sudo kill <PID>

注意事项

  • 权限要求:需 root 权限才能查看所有进程的文件占用情况。
  • 容器环境:若涉及容器,需在宿主机的 PID namespace 中操作(如 nsenter)。

如果有具体的日志文件名或怀疑的进程名,可以提供更多信息进一步分析!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23426

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?