2013-08-22 83 views
0

我已經做了下面的腳本通過cron猛砸ping狀態腳本

HOSTS="ns1.server.com ns2.server.com" 
SUBJECT="Host Down" 

for myHost in $HOSTS 
do 
count=$(ping -c 10 $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{    
print $1 }') 
if [ $count -eq 0 ]; then 
echo "Host : $myHost is down (ping failed) at $(date)" | sendEmail -f email (email address removed) -u "$SUBJECT" etc etc 
fi 
done 

運行每5分鐘然而,當一臺主機宕機,我會接受並每5分鐘反映此電子郵件。我想要的是添加該功能,以便它只在狀態發生變化時通過電子郵件發送給我。即如果它關閉,我不希望它發送任何進一步的更新,直到它啓動。

+0

什麼地方保存先前的結果(在文件中),並與比較當前結果? – fedorqui

+0

是的,這就是我想要做的,但不知道如何編寫它 – Lurch

+0

你可以使用兩個文件:'活着'和'下'。然後,例如,如果它已關閉,現在您檢測到它再次關閉,請檢查該名稱是否在「down」文件中。 – fedorqui

回答

1

我覺得這樣的事情可以幫助:

#!/bin/bash 

HOSTS="ns1.server.com ns2.server.com" 
HOSTS="123.123.1.1 ns1.server.com" 
SUBJECT="Host Down" 

ping_attempts=1 
down_hosts=down_hosts.txt 

for myHost in $HOSTS 
do 
     count=$(ping -c $ping_attempts $myHost | awk -F, '/received/{print $2*1}') 
     echo $count 
     if [ $count -eq 0 ]; then 
       echo "$myHost is down" 
       if [ $(grep -c "$myHost" "$down_hosts") -eq 0 ]; then 
         echo "Host : $myHost is down (ping failed) at $(date)" 
         echo "$myHost" >> $down_hosts 
       fi 
     else 
       echo "$myHost is alive" 
       if [ $(grep -c "$myHost" "$down_hosts") -eq 1 ]; then 
         echo "Host : $myHost is up (ping ok) at $(date)" 
         sed -i "/$myHost/d" "$down_hosts" 
       fi 
     fi 
done 
+0

哈哈,''if [$(grep -c「$ myHost」$ down_hosts)-eq 0];那麼''很有趣。使用''if [[grep -q「myHost」「$ down_hosts」]];那麼''而不是。這是有效的,因爲如果''grep''找到任何東西,那麼退出代碼將爲0,否則爲1.任何大於1的值都是錯誤。另外,不要忘記'''$ down_hosts「'''周圍的引號,因爲如果'$ down_hosts''包含任何空格,它將會中斷 –

+0

Thanks,@ Aleks-DanielJakimenko! – fedorqui

+0

@alekx我把你的改變添加到了上面,得到了./ping.sh:第15行:期望的條件二元運算符 ./ping.sh:第15行:在'-q'附近的語法錯誤 ./ping.sh:第15行:'if [[grep -q「myHost」「$ down_hosts」]];然後' – Lurch

0

評論中有一個很好的觀點,您可能想要使用無限循環。但是,正如你問不同的東西,在這裏你去:

HOSTS="ns1.server.com ns2.server.com" 
SUBJECT="Host Down" 
PATH_STATUS='/yourfolder/hoststatus_' # For example can be located in /tmp. 

for myHost in $HOSTS; do 
    count=$(ping -c 10 "$myHost" | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }') 
    [[ -f "$PATH_STATUS$myHost"]] && prevStatus=$(cat "$PATH_STATUS$myHost") || prevStatus='unknown' 
    [[ $count == 0 ]] && curStatus='down' || curStatus='up' 

    if [[ $curStatus != $prevStatus ]]; then 
     echo "$curStatus" > "$PATH_STATUS$myHost" 
     echo "Host : $myHost is $curStatus at $(date)" | sendEmail 
    fi 
done 
+0

cat:ns1.server.com:沒有這樣的文件或目錄 – Lurch

+0

第一次啓動腳本時,此錯誤只會彈出一次。其他一切都應該正常工作。我將編輯 –

+0

即使重新運行,也不會創建任何文件。 – Lurch