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

时间:2015-06-19 10:14:28

标签: linux file gedit lsof

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

我想创建一个监视文件是否已打开的脚本,如果是,我希望它向特定的电子邮件地址发送警报。我想到的文件是一个普通文件。

我尝试使用lsof | grep filename检查文件是否在gedit中打开,但命令没有返回任何内容。

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您可以使用ls -lrt,它显示shell中的最后一次RW操作。然后,您可以断定文件是否已打开。确保您在确切的目录中。

答案 3 :(得分:0)

您可以(除了其他答案)使用特定于Linux的inotify(7)工具。

我理解你想跟踪一个(或几个)特定给定文件,使用固定文件路径(实际上是给定的i-node)。例如。您希望跟踪何时访问或修改/var/run/foobar,并在发生这种情况时执行某些操作

特别是,您可能希望安装并使用incrond(8)并通过incrontab(5)配置它

如果您想要在某个给定文件(在本地本地,例如Ext4,BTRS,但不是NFS文件系统上)访问或修改时运行脚本,请使用 inotify incrond正是为此目的而完成的。

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

如果您喜欢的文件是某种源文件,您可能会对版本控制系统(如git)或构建器系统(如GNU make)感兴趣;这些工具以某种方式与文件修改有关。

您也可以将特定文件系统放在某个FUSE文件系统中,并编写自己的FUSE守护程序。

如果您可以限制和修改访问该文件的程序,则可能需要使用公告locking,例如flock(2)lockf(3)

也许文件中的数据应该在某些database内(例如sqlite或真实的DBMS,例如PostGreSQL ou MongoDBACID属性很重要....

请注意,filesystemmount选项可能非常重要。

您可能想要使用stat(1)命令。

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

可能工作流程是错误的(在几个能够编写它的用户之间有一个共享文件),你应该以其他方式处理整个问题。对于宠物项目,我至少建议使用一些咨询锁,并访问&使用flock通过您自己的程序(可能setuid)修改的信息(这不包括gedit等普通编辑器或cat等命令。 )。但是,您的隐式用例似乎非常适合DBMS方法(数据库不必包含大量数据,可能很小),或者像GDBM library这样的索引锁定文件正在处理。

请记住,在POSIX系统和Linux上,多个进程可以访问(甚至修改)同一个文件(除非您使用某些锁定或同步)。

阅读Advanced Linux Programming书籍(免费提供)会给你一个更广泛的图景(但它没有提到书中出现的 inotify )。