确定文件是否已打开

确定文件是否已打开

我想创建一个 bash 脚本来确定我的文件是否已被其他用户打开。

我已经尝试过了,lsof但效果不如人意。文件可以有不同类型的扩展名,例如 txt、pl、conf、cfg 等。有人能帮我吗?

我有一台服务器,里面有很多 .conf 文件。如果我在一个文件中写入,我就不知道其他用户是否也在同一个文件中写入。所以我想编写一个脚本让我知道这一点。

我尝试过类似这样的事情lsof | grep MyFilelsof /root/blabla/myfolder/myfile也许我不明白这个工具的用途。

我会尝试更好地解释我的问题。有许多用户可以修改 .conf 文件。如果两个用户对同一个文件进行操作,则最后一次保存将覆盖另一个用户所做的更改。我的脚本想要警告用户该文件已被另一个用户打开,并且可能以只读模式打开该文件。我已经尝试过ps aux(谢谢提示)但我无法估计我的文件是否最近被关闭。

答案1

lsof 准确列出所有打开的文件。

“问题”在于大多数编辑器打开文件,读取内容(进入内存),然后关闭文件。

编辑者在写入更改时将打开该文件。

要查看是否有任何编辑器正在使用该文件,请针对所有用户运行

ps aux | grep file name

例子

在一个终端中使用 nano 打开一个测试文件。

在另一个终端中运行以下命令:

bodhi@daemon:~$sudo lsof | grep test.file
[sudo] password for bodhi: 

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.

注意:没有输出;)

现在运行 ps aux

bodhi@daemon:~$sudo ps aux | grep test.file
bodhi     4736  0.0  0.0 121096  3404 pts/3    S+   17:49   0:00 nano test.file

现在我们看到了我们想要的信息;)

nano 出现并且我们正在编辑 test.file

答案2

@bodhi.zazen 准确地展示了您的文件未显示在 lsof 输出中的原因。

好吧,因为我们缺少你的用例的描述,我假设你的脚本

  • 做某事需要时间
  • 更改其他文件的内容,这些文件的内容可能在脚本启动和准备更改文件之间被修改过。

如果是这种情况,您可以做的一件事是:

  • 获取脚本想要提前修改的文件的校验和,例如:sha1sum <file>
  • 做一些耗时的事情
  • 检查文件的当前校验和。如果与之前相同,则表示没有被修改;如果不同,则可以做出决定并要求脚本用户决定是否覆盖或显示差异等。

这不是最理想的,而且由于我们缺少背景信息,所以这只是瞎猜,但也许它会在某种程度上对你有帮助。

相关内容