Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查文件是否在Linux中打开?_Linux_File_Gedit_Lsof - Fatal编程技术网

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

如何检查文件是否在Linux中打开?,linux,file,gedit,lsof,Linux,File,Gedit,Lsof,问题是,我想跟踪用户是否试图在共享帐户上打开文件。我正在寻找任何可以帮助我知道相关文件是否在运行时打开的记录/技术 我想创建一个脚本来监视文件是否打开,如果打开,我想让它向特定的电子邮件地址发送警报。我想到的文件是一个普通文件 我尝试使用lsof | grep filename检查文件是否在gedit中打开,但该命令没有返回任何内容 事实上,我正在为一个pet项目尝试这一点,因此提出了一个问题。您可以使用ls-lrt,它显示shell中最后的RW操作。然后就可以断定文件是否已打开。确保您位于正确

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

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

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


事实上,我正在为一个pet项目尝试这一点,因此提出了一个问题。

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

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

您可以(除其他答案外)使用Linux特定的功能

我知道您希望跟踪一个(或几个)特定的给定文件,并使用固定的文件路径(实际上是给定的I节点)。例如,您可能希望跟踪何时访问或修改
/var/run/foobar
,并在发生这种情况时采取措施

特别是,您可能希望通过

如果希望在访问或修改某个给定文件时运行脚本(在本机本地文件系统上,例如Ext4、BTRS等,但不是NFS文件系统上),请使用inotify
incrond

请注意,
inotify
对于远程网络文件(例如NFS文件系统)不起作用(特别是当另一台NFS客户端计算机正在修改文件时)

如果您喜欢的文件是源文件,那么您可能会对版本控制系统(如)或生成器系统(如)感兴趣;在某种程度上,这些工具与文件修改相关

您还可以让特定的文件系统位于某个文件系统中,并编写自己的守护程序

如果可以限制和修改访问该文件的程序,则可能需要使用advisory,例如

也许文件中的数据应该是某种格式的(例如,或像ou这样的真正的DBMS)。财产很重要

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

您可能需要使用该命令

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

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

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


阅读这本书(免费提供)会给你一个更广阔的图景(但它没有提到在写这本书之后出现的inotify)。

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

“ls-lrt”使用修改时间戳进行排序。如果您的文件系统支持它(在Linux中通常支持),您也可以使用“ls-lrt--time=atime”查看上次访问文件的时间。我建议使用
wc-l
而不是
wc-w
,后者适用于更多情况,并且
lsof
不会在每行放置超过一个文件名。您指向高级Linux编程书的链接已失效。