在 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 {}
原因是在 crash 後啟動 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 {} \+
當
inotifywait
輸出字元串“ Watches established. ”時,可以安全地在觀察的 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
‘inotifywait -m’ 使它無限期地執行。它必須被殺死,‘somedir’ rm -r’ed 或 fs of ‘somedir’ umount’ed 以獲得退出狀態。
‘find’ 永遠不會執行,除非 ‘inotifywait’ 退出 0。
這個可能有幫助;
inotifywait -r -d -o >(tee /absolute/path/to/file|grep ‘something’ && find ‘somedir’) ‘somedir’,或者
inotifywait -r -d -o /absolute/path/to/file ‘somedir’
grep ‘somthing’ /absolute/path/to/file && find ‘somedir’。
‘-d’ 守護程序模式,-m + 在後台執行。