Shell
使用 inotify 監控目錄但不能 100% 工作
我編寫了一個 bash 腳本來監視特定目錄
/root/secondfolder/
:#!/bin/sh while inotifywait -mr -e close_write "/root/secondfolder/" do echo "close_write" done
當我創建一個名為
fourth.txt
in的文件/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