【问题标题】:check if file is open with lsoflsof 检查文件是否打开
【发布时间】:2013-06-23 16:50:51
【问题描述】:

我正在使用 linux mint 13 xfce 并且我有一个名为 wv.gold 的文件,我正在尝试检查 bash 是否已被任何程序打开(例如,我在 sublime-textgedit 中打开它)

在许多论坛上,人们说如果我运行lsof | grep filename,我应该得到0,如果它是打开的,或者256(1),如果它是关闭的,但事实上,如果我使用grep "wv.gold" 运行,我什么也得不到(空字符串),如果我使用grep gold 来获取一个小清单。

列表类似于:

bash       2045  user   cwd   DIR   8,1     4096     658031 /home/user/path/to/dir
bash       2082  user   cwd   DIR   8,1     4096     658031 /home/user/path/to/dir
watch      4463  user   cwd   DIR   8,1     4096     658031 /home/user/path/to/dir
gedit     16679  user   cwd   DIR   8,1     4096     658031 /home/user/path/to/dir
lsof      20823  user   cwd   DIR   8,1     4096     658031 /home/user/path/to/dir
grep      20824  user   cwd   DIR   8,1     4096     658031 /home/user/path/to/dir
lsof      20825  user   cwd   DIR   8,1     4096     658031 /home/user/path/to/dir

因此,我得到了目录的路径,但不是文件的路径(那里还有其他文件),无论哪种方式都只能到 gedit 进程,而不是 sublime-text 进程。

有没有一些简单的方法可以查看一个 txt 文件是否被其他程序打开?

编辑:事实证明(参见来自@mata 和@ctn 的cmets)一些编辑器加载文件并立即关闭它们,并且他们只是在保存文件时重新打开文件。这样,我们只有在他们还在打开一个大文件时才能看到它(因为你有时间在打开时观察它),然后它立即消失。

【问题讨论】:

  • psmisc 尝试fuser。对于大多数发行版,应该以 psmisc 包的形式提供。请注意,许多文本编辑器不会为其打开的文件保留打开的文件句柄。他们读取文件,将其关闭并在保存时将其写回。
  • 确保您以root用户身份运行lsof,否则显示的内容将受到严重限制

标签: linux bash file


【解决方案1】:

lsof 的输出中出现的行是打开的文件。如果您的文件不存在,则表示它未打开。列中有 PID(打开文件的程序的进程 ID)和 FD(与打开的文件关联的文件描述符)。这些没有特定的值表示打开/关闭。如果它出现就意味着它已经打开了。

查看http://linux.die.net/man/8/lsof并搜索文字contains the first nine characters

【讨论】:

  • 但是,当它在 gedit 中打开时运行 lsof | grep "wv.gold" 时,我没有打印任何行
  • 正如 mata 对您的问题所评论的那样,编辑者可以打开文件,将其完全读入内存并关闭文件。
  • 如果要查看 gedit 当前打开了哪些进程,首先获取 gedit 的 pid:pgrep gedit,然后是打开文件列表:ls -l /proc/<pid>/fd。您应该看到4 -> /some/file.txt 形式的符号链接
  • 我跑了sudo ls -l /proc/<pid>/fd,得到这个数字指向这个文件,但不是打开的文件wv.gold0 -> /dev/null1 -> pipe:[7587]10 -> anon_inode:[eventfd]10 -> anon_inode:[eventfd]11 -> anon_inode:inotify12 -> socket:[298116]13 -> /home/user/.local/share/gvfs-metadata/home@987654 @2 -> pipe:[7587]3 -> socket:[301059]4 -> anon_inode:[eventfd]5 -> socket:[298112]6 -> socket:[296715]7 -> anon_inode:[eventfd]8 -> anon_inode:[eventfd]9 -> socket:[298115]
  • 这意味着 wv.gold 不会被 gedit 保持打开状态。它已完全读入内存并关闭。 gedit 只会再次打开它以读取可能发生的更改或将文件写回磁盘。实际上没有任何(通用)方法可以做你想做的事。唯一的可能是 gedit 为每个打开的文件保留一个交换文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多