Linux &引用;查找“;命令无法检测执行期间添加的文件

Linux &引用;查找“;命令无法检测执行期间添加的文件,linux,unix,find,lag,Linux,Unix,Find,Lag,多年来,Stackoverflow在无数场合救了我的命。现在,是我发布我的第一个问题的时候了,到目前为止我还没有找到答案 我有一个工具(语言/实现无关),它接受文本文件作为输入。这个文本文件(我们称之为file_list.txt)包含一长串文件路径,每行一个。然后,该工具迭代文件_list.txt中的行,并对每个文件路径执行某些操作。这需要持续进行,并且file_list.txt需要始终包含最新的文件路径,因为用户不断从被监视的共享中上载或删除文件。为了实现这一点,我设置了一个cron作业,它调

多年来,Stackoverflow在无数场合救了我的命。现在,是我发布我的第一个问题的时候了,到目前为止我还没有找到答案

我有一个工具(语言/实现无关),它接受文本文件作为输入。这个文本文件(我们称之为file_list.txt)包含一长串文件路径,每行一个。然后,该工具迭代文件_list.txt中的行,并对每个文件路径执行某些操作。这需要持续进行,并且file_list.txt需要始终包含最新的文件路径,因为用户不断从被监视的共享中上载或删除文件。为了实现这一点,我设置了一个cron作业,它调用一个脚本。首先,脚本使用所需的搜索参数调用find实用程序,并将输出传递到临时文件。当文件完全填充后,它将移动到文件_list.txt。然后,完成此操作后,将使用文件_list.txt作为输入参数调用该工具

到目前为止,一切顺利。正在监视的共享非常大(~60 TB),执行find命令大约需要5小时。这不是问题,因为我们有多个重叠的find命令并行运行(每小时触发一次)。整个设置在计算场上运行,因此CPU利用率等也不是问题

问题出现在文件检测的滞后时间。理想情况下,我希望用户添加一个文件,并且我希望一个已经运行的、重叠的find命令能够在几分钟内检测到这个文件。但是,我注意到,已经运行的find命令都不会检测到这个文件。只有在添加此文件后启动的查找命令才会检测到该文件。这意味着,一般来说,我需要等待大约5个小时才能检测到新添加的文件。这使我相信find实用程序在触发共享状态时会以某种方式作用于共享状态的“缓存”版本。这是真的吗?有人能证实这一点吗?如果是这样,我能做些什么来改善检测滞后


如果需要进一步澄清,请告诉我。我很乐意提供更多细节。

总结一下:您有一个巨大的文件系统卷(60 TB),其中包含大量文件,您可以使用
find(1)
命名大量文件,并将这些名称放入文本文件中进行分析。您发现,如果文件是在
find(1)
启动后但在完成之前创建的,则不会列出这些文件

我认为最好的解决方案是停止将此视为批处理作业,并使用“在线”完成。您可以使用
inotify
API立即获得文件系统更改的通知,包括正在创建的新文件。当然有原始的C API,也有优秀的API

使用
inotify
,您可以启动一次watcher程序,并使其保持连续运行(如果需要重新启动,请在管理员的指导下)。然后,操作系统可以在相关文件系统事件发生时通知您,您可以立即响应,而不是等待下一次扫描


您的用例的一个缺点可能是watcher程序确实需要在本地安装了文件系统的机器上运行。但是,所需的总体计算资源可能比当前重复线性扫描的方法少得多。

执行
查找
命令并将输出传输到临时文件可能会达到一定的规模,但远不是最佳的。如果您想要一个资源密集度较低、反应性更强的解决方案,我建议您考虑使用以下界面重新实现您的软件:

inotifyapi提供了一种监控文件系统事件的机制。 Inotify可用于监视单个文件或 目录。监视目录时,inotify将返回 目录本身和目录内文件的事件

因此,每次文件更改都会引发一个事件;或正在添加的文件


请注意,您可以保留最新的内部文件列表,只有在您收到活动时才需要更改。

感谢John和@ChrisMaes的回答。不幸的是,由于设置此共享的性质,inotify无法使用。当然,这将是理想的解决方案。还有其他建议吗?@silverstreak:您使用的是什么共享协议?NFS?当内部的文件或目录被修改时,目录时间戳是否得到更新?