问题是,我想跟踪用户是否尝试打开共享帐户上的文件。我正在寻找任何记录/技术来帮助我知道相关文件是否在运行时打开。
我想创建一个脚本来监视文件是否打开,如果是,我希望它向特定的电子邮件地址发送警报。我正在考虑的文件是常规文件。
我尝试使用
lsof | grep filename
检查文件是否在 gedit 中打开,但该命令不返回任何内容。
实际上,我正在为一个宠物项目尝试这个,因此就有了这个问题。
命令
lsof -t filename
显示打开特定文件的所有进程的 ID。 lsof -t filename | wc -w
为您提供当前访问该文件的进程数。
文件已被读入 gedit 等编辑器的事实并不意味着该文件仍处于打开状态。编辑器很可能会打开文件,读取其内容,然后关闭文件。编辑文件后,您可以选择覆盖现有文件或另存为另一个文件。
您可以(除了其他答案之外)使用特定于 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 守护进程。
如果您可以限制和修改访问该文件的程序,您可能需要使用建议性也许文件中的数据应该位于某个数据库中(例如sqlite或像PostGreSQL或MongoDB这样的真正的DBMS)。 ACID属性很重要....
请注意,您可能想使用stat(1) 命令。
如果不了解真实的用例和动机,就很难提供更多帮助。你应该避免一些 XY 问题
工作流程可能是错误的(在多个能够写入该文件的用户之间有一个共享文件),您应该以其他方式解决整个问题。对于宠物项目,我至少建议使用一些咨询锁,并通过您自己的程序(可能是setuid)使用 flock
(这不包括像 gedit
这样的普通编辑器或像这样的命令来访问和修改信息。
cat
...)。但是,您的隐式用例似乎非常适合 DBMS 方法(数据库不必包含大量数据,它可能很小),或者正在处理一些索引锁定文件,例如GDBM 库
。请记住,在 POSIX 系统和 Linux 上,多个进程可以访问(甚至修改)
同时同一个文件(除非您使用某种锁定或同步)。 阅读《高级 Linux 编程》一书(免费)会给你一个更广阔的视野(但它没有提到本书写完后出现的
inotifyls -lrt