利用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】磁碟監控指令碼指令碼
- 利用 Shell 指令碼來監控 Linux 系統的記憶體指令碼Linux記憶體
- 案例五:shell指令碼實現定時監控http服務的執行狀態指令碼HTTP
- 利用superlance監控supervisor執行狀態
- Shell 系統資訊監控指令碼指令碼
- 監控磁碟使用率的shell指令碼指令碼
- shell指令碼:監控MySQL服務是否正常指令碼MySql
- Shell 指令碼中的exit狀態解釋指令碼
- shell指令碼監控啟動停止weblogic服務指令碼Web
- centos 監控web站點是否500 指令碼CentOSWeb指令碼
- 透過shell指令碼監控日誌切換頻率指令碼
- 根據ip列表檢測主機狀態(shell指令碼)指令碼
- 分享實用監控指令碼:使用Shell檢查程式是否存在指令碼
- 用於自動監控磁碟使用情況的 Shell 指令碼指令碼
- 網站http請求狀態碼網站HTTP
- 網路卡流量監控指令碼,python實現指令碼Python
- 網站監控網站劫持,網站監控網站劫持有哪些需要注意的網站
- 如何用bash shell 指令碼監控 Linux記憶體、磁碟和 CPU?指令碼Linux記憶體
- 2. 監控nginx伺服器502狀態碼Nginx伺服器
- Docker 之 執行狀態監控Docker
- MySQL MHA 執行狀態監控MySql
- 網站安全監控的方法講解,網站安全監控技術網站
- PostgreSQL之鎖監控指令碼SQL指令碼
- 7. 監控MySQL主從狀態MySql
- 用 Linux Shell 指令碼來監控磁碟使用情況併傳送郵件Linux指令碼
- 監控系統告警指令碼集合指令碼
- 利用CSP探測網站登陸狀態(alipay/baidu為例)網站AI
- 怎麼監控 Linux 伺服器狀態?Linux伺服器
- 巧用Zabbix自定義監控Mysql效能狀態MySql
- springCloud入門學習--Hystrix狀態監控SpringGCCloud
- upptime:使用GitHub Actions監控你的網站健康監控Github網站
- shell指令碼指令碼
- [ Shell ] 通過 Shell 指令碼匯出 CDL 網表指令碼
- 【網路安全】Shell 指令碼學習指令碼
- 基於websocket的celery任務狀態監控Web
- zabbix應用-監控mysql slave 主從狀態MySql
- 使用 Prometheus 監控 eKuiper 規則執行狀態PrometheusUI