2013-04-08 123 views
1

我有一個腳本,我想在我的Web服務器上每分鐘運行一次,以檢查日誌文件的最後3行,以查看程序的內存使用情況。該腳本的工作原理是爲內存獲得正確的結果,但我無法將其發送到電子郵件或退出 - 它只是掛起?腳本不執行,而是掛起

任何想法,爲什麼這不會退出?這是在服務器上作爲cron運行的最佳方法,以便記錄最後3行日誌?

#!/bin/bash 
LOG=/home/user/Scripts/test.txt 
SERVER=/home/user/Scripts/local/case.txt 
CASE=$(head -n 1 $SERVER) 

grep INFO: | grep Memory $LOG | awk '{print $9}' | tail -n 3 | while read output; 
do 
    #echo $output 
    new=$(echo $output) 
    usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
    mag=$(echo $output | awk '{ print $2 }') 
    if [ $new -lt 10 ]; then 
    echo $new 
    mail -s "TEST" - Alert: Memory usage is at $usep%" "[email protected]" <<< \ 
    " \"$CASE \" - Memory usage is currently peaked to \"$mag ($usep%)\" on $(hostname) as on $(date)" 
    echo "email" 
    fi 
done 
+0

您可以在shell中運行郵件行嗎? '<<<'在那裏做什麼? – choroba 2013-04-08 10:11:58

+0

在'#!/ bin/bash'行下面添加'set -x',並從命令行運行腳本以查看發生了什麼。請給你的問題一個更好的標題。 – anubhava 2013-04-08 10:12:02

+0

對不起,問題標題 – Grimlockz 2013-04-08 10:37:52

回答

1

第一個grep正在讀取標準輸入。除非你用重定向(請告訴我們!)調用它,這就是它爲什麼會掛起的原因 - 它正在等待你鍵入一些輸入。

作爲速戰速決,改變

grep INFO: | grep Memory $LOG | awk ... 

閱讀

grep INFO: "$LOG" | grep Memory | awk ... 

(雙引號不是絕對必要在這裏,但一個好主意,學習的未來。)

好得多,重構多個grep s和tailawk腳本中:

awk '/INFO:/ && /Memory/ { g[NR%3+1] = $0 } 
    END { for (j=1; j<=3; ++j) print g[j] }' "$LOG" 

如果輸出的順序很重要,那麼您必須多提一點。

此外,new=$outputnew=$(echo $output)更爲可取,除非您特別要求分詞,在這種情況下,set -- $output既安全又更習慣。另請參閱http://porkmail.org/era/unix/award.html#echo

+0

是的,你應該把$ LOG移到第一個grep。 – 2013-04-08 10:33:26

+0

啊,謝謝 - 是的,這是等待輸入的grep - 謝謝 – Grimlockz 2013-04-08 10:36:41