![](/img/trans.png)
[英]Check if a file is opened by other process without opening it in C (Linux environment)
[英]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.