2012-05-10 27 views
2

我有一個bash腳本,它使用inotify-tools處理某些數據,以瞭解特定事件何時發生在文件系統上。如果在bash控制檯中運行,它會正常工作,但是當我嘗試將其作爲守護程序運行時,它會失敗。我認爲原因在於,inotifywait命令調用的所有輸出都轉到一個文件,因此| while之後的部分不再被調用。我該如何解決這個問題?這是我的腳本。使用inotify-tools作爲守護進程處理數據

#!/bin/bash 

inotifywait -d -r \ 
-o /dev/null \ 
-e close_write \ 
--exclude "^[\.+]|cgi-bin|recycle_bin" \ 
--format "%w:%&e:%f" \ 
$1| 
while IFS=':' read directory event file 
do 

    #doing my thing 

done 

所以,-d告訴inotifywait作爲守護程序運行,-r遞歸地做到這一點,-o是要保存輸出的文件。在我的情況該文件是/dev/null,因爲我並不真正需要的輸出,除了命令後處理的部分(| while...

回答

8

你不想跑inotify-wait在這種情況下,守護程序,因爲要繼續從命令輸出過程。你想替換-m-d命令行選項,它告訴inotifywait隨時監控的文件,並繼續打印到stdout

-m, --monitor 
      Instead of exiting after receiving a single event, execute 
      indefinitely. The default behaviour is to exit after the 
      first event occurs. 

如果你想要的東西在後臺運行,你需要的背景整個腳本。

+0

等一下,我知道,但我需要它在後臺運行,以便我可以關閉控制檯,註銷等,它應該仍然監視我的目錄。 –

+0

這就是我的意思是「背景整個腳本」。你需要讓*腳本作爲守護進程運行,而不僅僅是'inotifywait'程序。 – larsks

+0

但是手冊頁說這個「-d, - 守護進程 與--monitor相同,除了在後臺日志記錄事件 中運行到一個必須由--outfile指定的文件之外。意思是--syslog。 」 –

1

下面是使用nohup的解決方案(注:在我的測試,如果我指定-o似乎while循環沒有進行評估)

nohup inotifywait -m -r \ 
    -e close_write \ 
    --exclude "^[\.+]|cgi-bin|recycle_bin" \ 
    --format "%w:%&e:%f" \ 
    $1 | 
while IFS=':' read directory event file 
do 
    #doing my thing 
done >> /some/path/to/log 2>&1 & 
+0

當我這樣做並執行「pgrep inotifywait」(RHEL 6.x)時,我看到3個進程。爲什麼? –