2015-10-05 63 views
-1

我正在監視一個日誌文件(這是一個PBX隊列文件,它是在呼叫進入時寫入的,它是呼叫發生的結果,呼叫者是否掛斷等)在BASH中用inotifywait觸發事件

這是我有:

while inotifywait -m -e close_write /var/log/asterisk/queue_log_test; 
do 
    if [ tail -n1 /var/log/asterisk/queue_log | grep EXITWITHTIMEOUT ]; 
    then 
      php /usr/local/scripts/queue_monitor/pbx_queue_timeout.php 
    elif [ tail -n1 /var/log/asterisk/queue_log | grep ABANDON ]; 
    then 
      php /usr/local/scripts/queue_monitor/pbx_queue_abandon.php 
    elif [ tail -n1 /var/log/asterisk/queue_log | grep COMPLETE ]; 
    then 
      php /usr/local/scripts/queue_monitor/pbx_queue_complete.php 
    else 
    # Don't do anything unless we've found one of those 
    : 
    fi 
done 

現在,如果我運行該腳本,它成功地建立了手錶和檢測的改變/關閉(我都試過修改並CLOSE_WRITE,都工作)

Setting up watches. 
Watches established. 
/var/log/asterisk/queue_log_test CLOSE_WRITE,CLOSE 

但事件從未被觸發(我測試了inotify腳本之外的PHP腳本,它們執行得非常好)

如果我正在監視正在運行的文件的尾部,它會成功並找到短語:

[[email protected] ...local/scripts/queue_monitor]: tail /var/log/asterisk/queue_log_test 
ABANDON 
[Load: 0.00] [Time: 19:04:43] 
[[email protected] ...local/scripts/queue_monitor]: 

這是什麼我在這裏失蹤?

+0

您正在運行inotifywait並查看'queue_log_test',但正在測試'queue_log'中的更改。這兩個文件有什麼不同嗎? –

+0

嗨喬: 對不起,這是一個錯字,這兩個文件都存在。我創建了測試文件,因爲實際的queue_log文件是由PBX軟件寫入的,我不想幹涉它。要麼工作 – TD46

回答

1

您正在使用-m開關inotifywait,這使得它無限期地運行:

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

而while循環等待它完成,因此它可以評估是退出代碼確定循環是否應該繼續與否。

+0

好吧,我使用顯示器的原因是因爲我想讓它無限期地運行。 IE:如果發現事件,則觸發並繼續監視文件以備將來事件使用。有更好的方法來做到這一點嗎?現在你說這是有道理的,我沒有想到這樣 – TD46

+0

@ TD46只是刪除'-m',它將無限期地運行,因爲你在while循環內,並且'inotifywait'返回true,如果它觸發事件 –

+0

好吧,讓我彈出到服務器,並給它一個旋轉 – TD46