在 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 不起作用