【问题标题】:Watching a directory tree without inotify在没有 inotify 的情况下查看目录树
【发布时间】:2017-01-10 11:15:27
【问题描述】:

我正在尝试编写一个备份实用程序,它应该可以处理大量文件夹中大约 2 TB 的数据。

我希望它在文件被创建/编辑/删除时对文件执行操作,最好还有文件移动或重命名。

我搞砸了 fanotify,只是意识到它只适用于文件编辑。 如果可以的话,我反对使用 inotify,因为我必须编辑最大文件监视,我不想这样做。 我认为这会对性能产生很大影响。

我最好只设置一个文件监视,它可以递归地处理它下面的所有文件。 有没有这方面经验的人知道什么是好方法? 我应该去 inotify 并只接受性能打击吗? 或者我可以采取其他方法吗?

【问题讨论】:

  • 这听起来像是 XY 问题。你到底想做什么?我怀疑您正在尝试编写一个程序来保持两个磁盘“同步”,以便一个磁盘上的文件编辑出现在另一个磁盘上。如果这是您的目标,请考虑改用设置 RAID;它更高效、更可靠。
  • @ColonelThirtyTwo 很容易在两台有互联网连接的机器之间保持 2TB 的同步

标签: linux d inotify directory-tree fanotify


【解决方案1】:

我认为没有一种方法可以递归地监视目录树中的更改。另一方面,使用 inotify,您不需要为每个您观察的目录创建一个文件描述符。您创建一个 inotify 对象,然后使用 inotify_add_watch 向其中添加许多目录

int inotify_add_watch(int fd, const char *pathname, uint32_t mask);

【讨论】:

  • 那不会也增加很多开销吗?我不需要递归扫描我想在启动时观看的整个树吗?
  • 我想我可以完全扫描一次并将所有目录写入文件。然后在程序启动时加载该单个文件。
  • 您必须扫描一次,以便开始查看您找到的所有目录。从那时起,当您收到创建或删除目录的事件时,您必须相应地调用inotify_add_watch/inotify_rm_watch
  • 它的表现如何?假设...有一百万个目录,它会减慢电脑的速度吗?
  • 我还没有尝试过这么大的数字,但我认为没有更好的选择,所以可能值得尝试一下。如果您这样做,请告诉我们结果。
【解决方案2】:

我为一个微型 RAMDrive 编写了一个轮询备份应用程序;我有大量的经验来修复一些问题。我通常不喜欢轮询,但我使用的是 windows 和 std.file 库是古老的:Windows 10 使他们的库 5 主要版本落后;所以不用担心便携性。

我计划了 2 种模式:活动和睡眠模式,这将防止磁盘在切换到允许它们保持旋转状态的较长时间之前无意义地旋转一次。我才刚刚开始考虑检测和修复,ZFS 的媒体复制解决方案似乎很幼稚,因为 WinRAR 允许您对存档进行此操作。

我一个月前买了一台新电脑,但我仍在尝试备份我的文件。小心使用火卫一,即 std.anything。 std.file' 副本更改创建时间,这对于恢复的文件不正确;复制后需要读取旧文件的创建时间,自己调用OS函数,设置创建时间;所有这些元数据都带有一个 Windows 系统调用,因此这是开始研究 Linux 系统调用中的数据的好地方。

现在可能是重新访问 Python 并尝试的好时机:https://docs.python.org/3/library/pathlib.html 剧透:它在 3.5.2 中被破坏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2021-06-22
    相关资源
    最近更新 更多