我需要监视目录并根据发生的事件执行一些后期操作。我很熟悉,inotifywait
但由于我们使用基于 alpine 的 docker,我在想是否还有其他方法可以做到这一点。
然后我发现Inotifyd
,根据该文件,“虽然有一些围绕 inotify (inotify-tools) 设计的工具,但 alpine 有一个名为 inotifyd(busybox 的一部分)的内置工具,用于对文件系统事件执行命令。”
但问题是,a)根据 alpine 文档设置,inotifyd
与 b)相比inotifywait
,我找不到很多关于 inotifyd 的文章。所以我感觉它没有被广泛使用。
那么有 Inotifyd 经验的人可以解释一下吗?
答案1
我也知道不能很好地回答文档。特别是对于备受推崇的面具。
这可能会有所帮助:
会话中的 inotified 示例
localhost:~$ cat >handler.sh
#! /bin/sh
#1 is event, 2 is file or dir,
#3 is file only if 2 is dir.
echo $1 $2 $3
localhost:~$ inotifyd handler.sh
test:we &
[2] 5375
localhost:~$ touch test
e test
localhost:~$ echo "hello" > test
w test
面罩是可选的。如果未指定任何内容,则会监视所有事件。当指定并且需要多个事件时多个事件被整理。上面的例子表明这是可行的。
与 inotifywait 的主要区别在于 inotifyd 处理程序不能指定为表达式。它始终是作为 PROG 的单独文件。相反,对于 inotifywait,没有指定处理程序 PROG,而是将 inotifywait 调用输出通过管道传送或重定向到处理程序 EXPRESSION,如果需要,可以调用处理程序 PROG,如以下示例所示:
inotifywait 示例(没有会话。自己尝试一下)
#pipe inotifywait output
#(most straight forward)
#use EXPRESSION
inotifywait -e modify,attrib -m
test | while read -r event ; do
echo $event ; done &
#redirect inotifywait output with
#process substitution.
#use EXPRESSION
while IFS= read -r event ; do echo
$event ; done < <(inotifywait -e
modify,attrib -m setup) &
#using a PROG
inotifywait -e modify,attrib -m
test | while read -r event ; do
handler.sh ; done &
另外,使用 inotifywait 可以指定是否要连续监视目标,从而允许一次调用:
#notice no -m option
inotifywait -e attrib
crashflagfile | while read -r
event do ; restart.sh ; done &
至于效率,请考虑 -e 修改的简单参数处理,attrib 与 :we
使用 :we 不仅会更快地遇到错误,而且短符号受益于在整个事件掩码参数中基于每个字符的解析过程中的直接索引匹配。这将使事件掩码解析更快,从而为您的手表提供更好的启动性能。
对于添加手表和调度也存在差异。 Inotifyd 将执行 inotify 添加监视、轮询事件并使用 exec 或 execv 调用来调用处理程序。另一方面,inotifywait 将执行 inotify 添加监视、轮询事件,然后输出(写入)事件数据,从而 shell 将事件数据“管道”到表达式。所以这是 exec 调用 VS 写入 shell 表达式。比赛非常接近。即使 inotifyd 能够使用二进制可执行文件作为处理程序,shell 表达式也可以拥有自己的。那里有老争论。
因此,总的来说,inotifywait 增加了一些灵活性,监视集调用包含处理程序,因此不需要额外的处理程序文件,有些人喜欢这一点,而另一些人可能喜欢 inotifyd 的清晰分离以及更直接使用可执行文件的选择。
乍一看,它们在运行时性能上似乎相同,但 inotifywait 的 slartup 时间会较慢(尽管可以通过修改 inotifywait 的源代码以对事件使用单个字符来解决此问题)。当您不必直接使用 inotify 库时,两者都是不错的选择。
享受监控文件的乐趣!