Shell

使用 inotify 監控目錄但不能 100% 工作

  • November 20, 2017

我編寫了一個 bash 腳本來監視特定目錄/root/secondfolder/

#!/bin/sh

while inotifywait -mr -e close_write "/root/secondfolder/"
do
   echo "close_write"
done

當我創建一個名為fourth.txtin的文件/root/secondfolder/並向其寫入內容、保存並關閉它時,它會輸出以下內容:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

但是,它不會回顯“close_write”。這是為什麼?

inotifywait -m 是“監控”模式:它永遠不會退出。shell 執行它並等待退出程式碼知道是否執行循環體,但這永遠不會出現。

如果您刪除-m,它將起作用:

while inotifywait -r -e close_write "/root/secondfolder/"
do
   echo "close_write"
done

生產

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/root/secondfolder/ CLOSE_WRITE,CLOSE bar
close_write
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
...

預設情況下,inotifywait 將“在第一個事件發生後退出”,這是您在循環條件中想要的。


相反,您可能更喜歡閱讀以下標準輸出inotifywait

#!/bin/bash

while read line
do
   echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")

這個(bash)腳本將使用程序替換inotifywait將命令的每個輸出行讀入$line循環內的變數中。它避免了每次在循環周圍設置遞歸手錶,這可能很昂貴。如果不能使用 bash,則可以將命令通過管道傳遞到循環中:. 在此模式下為每個事件生成一行輸出,因此循環為每個事件執行一次。inotifywait ... | while read line ...``inotifywait

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