繁体   English   中英

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

[英]How to check if a file is opened in Linux?

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

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

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

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

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

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

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

您可以(除了其他答案)使用特定于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或像PostGreSQL ou MongoDB这样的真实DBMS)。 ACID属性很重要....

请注意, 文件系统挂载选项可能很重要。

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

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

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

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

阅读高级Linux编程书(免费提供)将为您提供更广泛的图片(但它没有提到在书写之后出现的inotify )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM