我想创建一个 bash 脚本来确定我的文件是否已被其他用户打开。
我已经尝试过了,lsof
但效果不如人意。文件可以有不同类型的扩展名,例如 txt、pl、conf、cfg 等。有人能帮我吗?
我有一台服务器,里面有很多 .conf 文件。如果我在一个文件中写入,我就不知道其他用户是否也在同一个文件中写入。所以我想编写一个脚本让我知道这一点。
我尝试过类似这样的事情lsof | grep MyFile
。lsof /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>
- 做一些耗时的事情
- 检查文件的当前校验和。如果与之前相同,则表示没有被修改;如果不同,则可以做出决定并要求脚本用户决定是否覆盖或显示差异等。
这不是最理想的,而且由于我们缺少背景信息,所以这只是瞎猜,但也许它会在某种程度上对你有帮助。