利用shell指令碼監控網站狀態

科技小先鋒發表於2017-11-22
  最近公司伺服器所在機房常因攻擊和網路故障導致網站無法正常訪問,為了能第一時間獲知網站無法訪問,並快速處理問題,特利用shell指令碼對伺服器訪問狀況進行監控,一但網站無法訪問即可觸發簡訊報警,這裡面參考了張晏和junnan的博文,在此表示感謝!!
 
         首先需要有一個已開通飛信的手機號,並把接收警報簡訊的手機號加為飛信好友(也可以自己給自己發),呼叫飛信的免費簡訊介面傳送報警簡訊,也可使用MSN報警,相對簡訊報警更及時。
         編輯指令碼http.sh
vi /opt/http.sh
 
#!/bin/sh

LANG=C
 
#被監控伺服器、埠列表

server_all_list=(
www.qq.com:80 
www.163.com:80 
www.sina.com:80 

)
 
telnum=已開通飛信的手機號

passwd=飛信密碼
 
date=$(date -d “today” +”%Y-%m-%d_%H:%M:%S”)
#採用HTTP POST方式傳送檢測資訊給介面程式interface.php,介面程式負責分析資訊,決定是否傳送報警MSN訊息、手機簡訊、電子郵件。

send_msg_to_interface()

{

        if [[ $2 = “0” ]] || [[ $2 = “2” ]]; then

                #開始傳送警報簡訊,13500000000是接收方手機號

                curl -m 600 -d username=${telnum} -d password=${passwd} -d sendto=13500000000 -d message=$1  
http://sms.api.bz/fetion.php
  echo “`date +`%Y-%m-%d %H:%M:%S“      $1 “>> http_down.log

                #傳送msn警報訊息(如果不需要msn警報可以註釋這行)

#               curl -m 600 -d menu=http -d date=$date -d ip=$server_ip -d port=$server_port -d status=$status 
http://127.0.0.1/monitor/interface.php
        fi;
}
 
server_all_len=${#server_all_list[*]}

i=0

while  [ $i -lt $server_all_len ]

do

   server_ip=$(echo ${server_all_list[$i]} | awk -F `:` `{print $1}`)

   server_port=$(echo ${server_all_list[$i]} | awk -F `:` `{print $2}`)

   server_message=” “

   if curl -m 10 -G 
http://${server_all_list[$i]}/ > /dev/null 2>&1

   then

     #status:    0,http down    1,http ok    2,http down but ping ok

     status=1

           echo “伺服器${server_ip},埠${server_port}能夠正常訪問!”;

                   server_message=”伺服器${server_ip},埠${server_port}能夠正常訪問!”;

   else

       if curl -m 30 -G 
http://${server_all_list[$i]}/ > /dev/null 2>&1

       then

           status=1

           echo “伺服器${server_ip},埠${server_port}能夠正常訪問!”

                   server_message=”伺服器${server_ip},埠${server_port}能夠正常訪問!”;

       else

           if ping -c 1 $server_ip > /dev/null 2>&1

           then

               status=2

               echo “伺服器${server_ip},埠${server_port}無法訪問,但是能夠Ping通!”;

                           server_message=”伺服器${server_ip},埠${server_port}無法訪問,但是能夠Ping通!”;

           else

               status=0

               echo “伺服器${server_ip},埠${server_port}無法訪問,並且無法Ping通!”;

                           server_message=”伺服器${server_ip},埠${server_port}無法訪問,並且無法Ping通!”;

           fi

       fi

   fi

 send_msg_to_interface “${server_message}” “${status}”;

   let i++

done
 
interface.php (需要設定監控端伺服器的讓其可訪問到,如:http://127.0.0.1/monitor/interface.php,與上面指令碼對應)

這裡需要一個PHP類
sendMsg,用來通過PHP傳送訊息到MSN,下載後把目錄解壓到interface.php目錄即可。
 
include(`sendmsg/sendMsg.php`);

 

//HTTP伺服器監控

if (isset($_POST[“menu”]))

{

 if (htmlspecialchars($_POST[“menu”]) == “http”)   

 {   

  $date = htmlspecialchars($_POST[“date”]);   

  $ip = htmlspecialchars($_POST[“ip”]);

  $port = htmlspecialchars($_POST[“port”]);

  $status = htmlspecialchars($_POST[“status”]);//狀態,0表示無法訪問,1表示正常,2表示無法訪問但能ping通

 

  $message = “;

  switch($status)

  {

   case `0`:

    $message = $ip . `伺服器無法訪問`;

    break;

   case `1`:

    $message = $ip . `伺服器工作正常`;

    break;

   case `2`:

    $message = $ip . `伺服器無法訪問但能ping通`;

    break;

  }

 

  if ($status == 0 && $status == 1)

  {

   $sendMsg = new sendMsg();

   $sendMsg->login(`用來發訊息的MSN帳號`, `密碼`);

   $sendMsg->createSession(`用來接收訊息的MSN帳號`);

   $sendMsg->sendMessage(iconv(“GBK”, “UTF-8”, $message), `Times New Roman`, `FF0000`);

 

  }

 }

}
 
然後執行crontab -e,加入如下語句:
 
*/5 * * * * sh /opt/http.sh
 
service crond restart
 
這樣指令碼將會每5分鐘執行一次,如果檢查到網站故障就會觸發報警

        以上指令碼執行了很長一段時間都很正常,也能第一時間瞭解伺服器的down機情況,但最近發現不能報警了,飛信的簡訊介面不能呼叫了,無奈只能藉助於139郵件報警,郵箱跟手機繫結
 
利用sendEmail傳送報警郵件:
cd /opt

wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz

tar -zxvf sendEmail-v1.56.tar.gz

cd sendEmail-v1.56

cp sendEmail /usr/local/bin

chmod +x /usr/local/bin/sendEmail
#sendEmail使用方法
sendEmail -f 13512345678@139.com -t 13512345678@139.com -s smtp.139.com -u “from cacti” -xu 13512345678@139.com -xp 123456 -o message-charset=utf-8 -m “測試郵件傳送” 

#解釋:-f 表示傳送者的郵箱

     -t 表示接收者的郵箱

     -s 表示SMTP伺服器的域名或者ip

     -u 表示郵件的主題

     -xu 表示SMTP驗證的使用者名稱

     -xp 表示SMTP驗證的密碼(注意,這個密碼貌似有限制,例如我用d!5neyland就不能被正確識別)

     -m 表示郵件的內容如果你不帶-m引數的話,就會提示你自行輸入

     -o 文字資訊字符集,如不加這一項,傳送的中文資訊就會變成亂碼
 
把原指令碼中的
 curl -m 600 -d username=${telnum} -d password=${passwd} -d sendto=13500000000 -d message=$1  http://sms.api.bz/fetion.php
 
修改為:
sendEmail -f 13512345678@139.com -t 13512345678@139.com -s smtp.139.com -u “from cacti” -xu 13512345678@139.com -xp 123456 -o message-charset=utf-8 -m $1


本文轉自king_819 51CTO部落格,原文連結:http://blog.51cto.com/kerry/320349,如需轉載請自行聯絡原作者
 


相關文章