事情是这样的,我想追踪一个用户是否试图打开共享账户上的文件。我正在寻找任何记录/技术,帮助我了解相关文件是否在运行时被打开。
我想创建一个脚本来监视文件是否已打开,如果是,则将其发送到特定电子邮件地址的警报。我考虑的文件是普通文件。
我尝试使用lsof | grep filename
检查在gedit中是否打开了文件,但该命令没有返回任何内容。
实际上,我正在为一个宠物项目尝试这个,因此提出了这个问题。
命令lsof -t 文件名
显示了所有打开该特定文件的进程ID。 lsof -t 文件名 | wc -w
可以告诉您当前正在访问该文件的进程数量。
除了其他答案之外,您可以使用Linux特有的inotify(7)工具。
我理解您想要跟踪一个(或几个)特定的文件,具有固定的文件路径(实际上是给定的i-node)。例如,您希望在访问或修改/var/run/foobar
时进行跟踪,并在发生这种情况时执行某些操作
特别地,您可能希望安装并使用incrond(8),并通过incrontab(5)进行配置。
如果您想要在访问或修改某个给定文件(在本地原生文件系统,例如Ext4、BTRS等,但不是NFS文件系统)时运行脚本,请使用inotify,incrond
正是为此目的而设计的。
PS. 据我所知,inotify
对于远程网络文件(例如NFS文件系统,特别是当另一个NFS客户机正在修改文件时)效果不佳。
如果您喜欢的文件是源文件,您可能会对版本控制系统(如git)或构建系统(如GNU make)感兴趣;在某种程度上,这些工具与文件修改有关。
您还可以将特定的文件系统放置在某些FUSE文件系统中,并编写自己的FUSE守护程序。
如果您可以限制和修改访问文件的程序,您可能希望使用咨询性锁定,例如flock(2),lockf(3)。flock
来访问和修改信息(这不包括像gedit
或cat
这样的普通编辑器或命令)。但是,您隐含的用例似乎非常适合DBMS方法(数据库不必包含大量数据,它可能很小),或者像GDBM库这样的索引锁定文件进行处理。
请记住,在POSIX系统和Linux上,多个进程可以同时访问(甚至修改)同一个文件(除非您使用某些锁定或同步方法)。
阅读《高级Linux编程》这本书(免费提供)可以让您有一个更广泛的视角(但它没有提到在该书写作之后出现的inotify)。你可以使用ls -lrt
命令,在shell中显示最后的读写操作。然后你就可以得出文件是否被打开的结论。确保你在正确的目录下。
wc -l
而不是wc -w
,因为它适用于更多的情况,而且lsof
不会在一行中放置多个文件名。 - Alexis Wilke