利用shell指令碼監控網站狀態
最近公司伺服器所在機房常因攻擊和網路故障導致網站無法正常訪問,為了能第一時間獲知網站無法訪問,並快速處理問題,特利用shell指令碼對伺服器訪問狀況進行監控,一但網站無法訪問即可觸發簡訊報警,這裡面參考了張晏和junnan的博文,在此表示感謝!!
首先需要有一個已開通飛信的手機號,並把接收警報簡訊的手機號加為飛信好友(也可以自己給自己發),呼叫飛信的免費簡訊介面傳送報警簡訊,也可使用MSN報警,相對簡訊報警更及時。
編輯指令碼http.sh
vi /opt/http.sh
#!/bin/sh
LANG=C
LANG=C
telnum=已開通飛信的手機號
passwd=飛信密碼
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;
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
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目錄即可。
這裡需要一個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`);
}
}
}
//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
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 文字資訊字符集,如不加這一項,傳送的中文資訊就會變成亂碼
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,如需轉載請自行聯絡原作者
相關文章
- Shell指令碼監控MySQL主從狀態指令碼MySql
- 使用Shell指令碼程式監控網站URL是否正常指令碼網站
- shell+curl監控網站頁面(域名訪問狀態),並利用sendemail傳送郵件網站AI
- 【shell】磁碟監控指令碼指令碼
- 利用AFNetworking監控網路狀態 - iOSiOS
- oracle會話監控shell指令碼Oracle會話指令碼
- Shell 系統資訊監控指令碼指令碼
- 利用btrace線上監控java程式狀態Java
- 案例五:shell指令碼實現定時監控http服務的執行狀態指令碼HTTP
- 利用shell指令碼生成動態sql指令碼SQL
- 利用 Shell 指令碼來監控 Linux 系統的記憶體指令碼Linux記憶體
- 透過shell指令碼監控oracle session指令碼OracleSession
- 常用的主機監控shell指令碼指令碼
- 通過shell指令碼監控oracle session指令碼OracleSession
- 利用superlance監控supervisor執行狀態
- oracle資料庫執行狀態監控SHELLOracle資料庫
- shell指令碼:監控MySQL服務是否正常指令碼MySql
- 監控磁碟使用率的shell指令碼指令碼
- 我常用的主機監控Shell指令碼指令碼
- AIX系統資源監控SHELL指令碼AI指令碼
- 監控系統使用情況shell指令碼指令碼
- Shell 指令碼中的exit狀態解釋指令碼
- 用c#監控網路狀態C#
- linux下利用curl監控web應用狀態LinuxWeb
- 每5秒監控5000埠的shell指令碼指令碼
- shell指令碼:監控MySQL服務是否正常薦指令碼MySql
- 監控Oracle資料庫的常用shell指令碼Oracle資料庫指令碼
- 監控指令碼指令碼
- systemtap的網路監控指令碼指令碼
- centos 監控web站點是否500 指令碼CentOSWeb指令碼
- 利用監控寶網站監控服務功能快速知曉網站/伺服器穩定性網站伺服器
- shell指令碼監控啟動停止weblogic服務指令碼Web
- 通過shell指令碼監控sql執行頻率指令碼SQL
- 透過shell指令碼監控sql執行頻率指令碼SQL
- [轉]監控Oracle資料庫的常用shell指令碼Oracle資料庫指令碼
- 監控Oracle資料庫的常用shell指令碼(轉)Oracle資料庫指令碼
- 利用SCHEDULER呼叫shell指令碼指令碼
- 網站訪問狀態和超時時間監控報警設定網站