在 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 + 在后台运行。