inotifywait 建立监视后执行命令

inotifywait 建立监视后执行命令

在 shell 脚本 ( test.sh) 内,我有 inotifywait 递归地监视一些目录 - “somedir”:

#!/bin/sh
inotifywait -r -m -e close_write "somedir" | while read f; do echo "$f hi"; done

当我在终端中执行此操作时,我将收到以下消息:

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

我需要的是触摸“somedir”下的所有文件手表成立了。为此,我使用:

find "somedir" -type f -exec touch {}

原因是当崩溃后启动 inotifywait 时,在此期间到达的所有文件将永远不会被拾取。所以问题是,我应该如何或何时执行find + touch

到目前为止,我试图让它在调用后休眠几秒钟test.sh,但从长远来看,当“somedir”中的子目录数量增加时,这不起作用。

我试图检查该进程是否正在运行并睡眠直到它出现,但似乎该进程在所有监视建立之前就出现了。

我尝试改变test.sh

#!/bin/sh
inotifywait -r -m -e close_write "somedir" && find "somedir" -type f -exec touch {} | 
while read f; do echo "$f hi"; done

但根本没有触及任何文件。所以我真的需要帮助......

附加信息是test.sh在后台运行:nohup test.sh &

有任何想法吗?谢谢

仅供参考:根据@xae的建议,我这样使用它:

nohup test.sh > /my.log 2>&1 &
while :; do (cat /my.log | grep "Watches established" > /dev/null) && break; done;
find "somedir" -type f -exec touch {} \+

答案1

inotifywait输出字符串“手表成立。" 在监视的 inode 中进行更改是安全的,因此您应该等待该字符串出现在标准错误上,然后再触摸文件。

作为一个例子,这段代码应该是这样的,

inotifywait -r -m -e close_write "somedir" \
2> >(while :;do read f; [ "$f" == "Watches established." ] && break;done;\
find "somedir" -type f -exec touch {} ";")\
| while read f; do echo "$f hi";done

答案2

'inotifywait -m' 使其无限期运行。它必须被杀死,'somedir' rm -r'ed 或 fs of 'somedir' umount'ed 才能获得退出状态。

除非“inotifywait”退出 0,否则“find”将永远不会运行。

这个可能会有所帮助;

inotifywait -r -d -o >(tee /absolute/path/to/file|grep 'something' && find 'somedir') 'somedir',或者

inotifywait -r -d -o /绝对/路径/到/文件'somedir'

grep 'something' /absolute/path/to/file && 找到 'somedir'。

'-d' 守护进程模式,-m + 在后台运行。

相关内容