Bash

在 inotifywait 建立手錶後執行命令

  • February 13, 2015

在 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 + 在後台執行。

引用自:https://unix.stackexchange.com/questions/182199