如何在Linux中检查文件是否打开?

问题描述 投票:0回答:4

问题是,我想跟踪用户是否尝试打开共享帐户上的文件。我正在寻找任何记录/技术来帮助我知道相关文件是否在运行时打开。

我想创建一个脚本来监视文件是否打开,如果是,我希望它向特定的电子邮件地址发送警报。我正在考虑的文件是常规文件。

我尝试使用

lsof | grep filename
检查文件是否在 gedit 中打开,但该命令不返回任何内容。

实际上,我正在为一个宠物项目尝试这个,因此就有了这个问题。

linux file gedit lsof
4个回答
13
投票

命令

lsof -t filename
显示打开特定文件的所有进程的 ID。
lsof -t filename | wc -w
为您提供当前访问该文件的进程数。


7
投票

文件已被读入 gedit 等编辑器的事实并不意味着该文件仍处于打开状态。编辑器很可能会打开文件,读取其内容,然后关闭文件。编辑文件后,您可以选择覆盖现有文件或另存为另一个文件。


3
投票

您可以(除了其他答案之外)使用特定于 Linux 的 inotify(7) 设施。

我理解您想要跟踪一个(或几个)特定的给定文件,具有固定的文件路径(实际上是给定的 i 节点)。例如。您想要跟踪

/var/run/foobar
何时被访问或修改,并在发生这种情况时执行某些操作

特别是,您可能想要安装和使用 incrond(8) 并通过 incrontab(5)

配置它

如果您希望 在某些给定文件(在本机本地,例如 Ext4、BTRS,...但不是 NFS 文件系统)被访问或修改时运行脚本,请使用 inotify incrond

 正是为此目的而完成。

PS。 AFAIK,inotify

 不适用于远程网络文件,例如NFS 文件系统(特别是当另一台 NFS 客户端计算机正在修改文件时)。

如果您喜欢的文件是某种源文件,您可能会对版本控制系统(如

git)或构建器系统(如GNU make)感兴趣;在某种程度上,这些工具与文件修改有关。

您还可以将特定的文件系统置于某些

FUSE 文件系统中,并编写您自己的 FUSE 守护进程。

如果您可以限制和修改访问该文件的程序,您可能需要使用建议性

锁定,例如flock(2)lockf(3)

也许文件中的数据应该位于某个

数据库中(例如sqlite或像PostGreSQLMongoDB这样的真正的DBMS)。 ACID属性很重要....

请注意,

filesystemmount选项可能很重要。

您可能想使用

stat(1) 命令。

如果不了解真实的用例和动机,就很难提供更多帮助。你应该避免一些 XY 问题

工作流程可能是错误的(在多个能够写入该文件的用户之间有一个共享文件),您应该以其他方式解决整个问题。对于宠物项目,我至少建议使用一些咨询锁,并通过您自己的程序(可能是

setuid)使用 flock(这不包括像 gedit

 这样的普通编辑器或像 
这样的命令来访问和修改信息。 cat
 ...)。但是,您的隐式用例似乎非常适合 DBMS 方法(数据库不必包含大量数据,它可能很小),或者正在处理一些索引锁定文件,例如 
GDBM 库
请记住,在 POSIX 系统和 Linux 上,多个进程可以访问

(甚至修改)

同时同一个文件(除非您使用某种锁定或同步)。 阅读《高级 Linux 编程》一书(免费)会给你一个更广阔的视野(但它没有提到本书写完后出现的

inotify

)。 您可以使用

ls -lrt

0
投票


© www.soinside.com 2019 - 2024. All rights reserved.