在 bash 中使用 inotifywait 监视文件夹以进行队列

Posted

技术标签:

【中文标题】在 bash 中使用 inotifywait 监视文件夹以进行队列【英文标题】:Monitor folder with inotifywait in bash for queue 【发布时间】:2016-06-19 18:35:38 【问题描述】:

我想使用 inotifywait 来监视一个特殊的文件夹,以使用 HandBrake 转换文件。我手动将文件移动到 monitor_folder 中。

简单的脚本如下所示:

inotifywait -mrq -e moved -e create --format %f /media/user/monitor_folder | while read FILE
do
    sleep 2
    HandBrakeCLI -i /media/user/monitor_folder/$FILE -o /media/user/finished/$FILE -e x264 -q 20 -B 160
done

只要我在每次从 HandBrake 转换后将每个文件都放入受监控的文件夹中,就可以正常工作。

在 HandBrake 工作时,inotifywait 似乎没有监控文件夹。即使我将两个文件同时放在受监控的文件夹中:只有第一个文件是由 HandBrake 转换的。

如何监控文件夹以使用 Handbrake 对其进行排队?

顺便说一句:真正的脚本要长得多,命令不仅仅是一行。

【问题讨论】:

无论每次移动的时间如何,显示的脚本都应有效(因为inotifywait 与循环体并行运行),它适用于我(将moved 更改为move 之后) ;因此,您的错误必须在真正的脚本中。 【参考方案1】:

在阅读以下内容之前,我认为这会对您有所帮助:How to execute a command whenever a file changes。

你有没有想过使用

-d, --daemon

与 --monitor 相同,除了在后台运行将事件记录到一个文件 必须由 --outfile 指定。暗示 --syslog。

代替

-m,--监视器

不是在接收到单个事件后退出,而是无限期地执行。

默认行为是在第一个事件发生后退出。

这将允许您检查 inotifywait

拾取的文件

还有

-r, --recursive

观察作为参数传递的任何目录的所有子目录。手表将递归设置到无限深度。不遍历符号链接。新创建的子目录也将被监视。

警告:如果您在查看大树的根目录时使用此选项,可能需要很长时间直到全部 inotify手表已建立,并且此时不会收到事件。此外,由于每个子目录将建立一个 inotify 手表,因此可能会达到每个用户的最大 inotify 手表数量。默认最大值为 8192;可以通过写入 /proc/sys/fs/inotify/max_user_watches 来增加它。 " 参考inotifywait

但是,强大的应用程序应该考虑到以下事实:监控逻辑中的错误竞争如下所述可能会离开 strong>缓存与文件系统状态不一致。 做一些一致性检查可能是明智的,并在检测到不一致时重建缓存。

参考inotify

【讨论】:

Michael Kerrisk 提供了有关陷阱和极端情况的进一步描述。感谢他,fluffy 可以优雅地处理这些案件。

以上是关于在 bash 中使用 inotifywait 监视文件夹以进行队列的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 inotifywait 的情况下监视目录的文件更改?

使用内部 bash 脚本时 Inotifywait 不起作用

将文件夹添加到监视目录时不会触发 inotifywait close_write

使用 bash 监视目录中的现有文件和新文件

监视添加到目录的文件大小(Bash)

使用 inotifywait 监视多个目录并运行脚本