業務場景:應用釋出監聽服務是否正常啟動,因為伺服器資源不夠上不了prometheus、grafana,所以寫的shell指令碼監聽。此指令碼適用於初創公司及小微企業使用。
準備工作
除了shell指令碼這裡還使用到了expect指令碼,expect類似有telnet你的伺服器埠返回相應的值判斷應用埠是否正常開啟。
yum install -y expect vim script.exp #!/usr/bin/expect set timeout 2 set host [lindex $argv 0] set port [lindex $argv 1] spawn telnet $host $port expect "*Escape character*" send "\1D\r quit\r"
然後是主體指令碼main.sh
#!/bin/bash ip=$1 #從引數中獲取目的IP port=$2 #從引數中獲取目的埠 AppName=$3 #從引數中獲取服務名稱 Fail=0 #失敗標記 FailCount=0 #連續失敗次數 Dmail=xxxxxxxxxx@qq.com #通知郵箱 while true do date=`date` expect -f script.exp $ip $port | grep "Escape character" > $ip-$port.log #擷取script.exp指令碼中返回的包含Escape character的行,重定向到紀錄檔檔案中,如果telnet失敗,則檔案為空。注意第一次啟動該指令碼會自動建立紀錄檔檔案,郵件也會異常提醒,重新執行後會就正常。 if [[ -s $ip-$port.log ]] then #若檔案存在且不為空,則埠連通 if [[ $Fail -eq 1 ]] #若埠連通且上一次為失敗狀態,則執行 then echo -e "$ip $port $AppName 已恢復正常\n$date" >> success.txt | mailx -s "【xxxx環境】$AppName已恢復正常!" $Dmail < success.txt #傳送郵件到[email protected] Fail=0 #重置失敗標記 FailCount=0 #重置失敗次數 cat /dev/null > success.txt
#郵件傳送後清空紀錄檔檔案,防止紀錄檔堆積傳送。 fi else FailCount=$(( $FailCount+1 )) #記錄連續失敗次數 if [[ $Fail -eq 0 ]] then #若埠不通且上一次為連通狀態,則執行 echo -e "$ip $port $AppName 監聽埠異常\n$date" >> fail.txt | mailx -s "【XXXX環境】$AppName異常請檢視檢查服務!!!" $Dmail < fail.txt Fail=1 #點亮失敗標記 cat /dev/null > fail.txt fi if [[ $FailCount -eq 180 ]] then #若連續失敗次數大於180次,重置失敗標記及最大連續失敗次數,若仍失敗則再次傳送郵件提醒。 FailCount=0 Fail=0 fi fi sleep 2 done
郵箱通知設定
#郵箱設定教學:https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256 yum -y install mailx vim /etc/mail.rc set from=xxxxxxxxx@qq.com # 這裡必須和set smtp-auth-user的郵箱一樣 set smtp=smtps://smtp.qq.com:465 set smtp-auth-user=xxxxxxxxx@qq.com set smtp-auth-password=郵箱授權碼 set smtp-auth=login set ssl-verify=ignore set nss-config-dir=/root/.certs
郵箱證書設定,避免不必要的異常。
mkdir -p /root/.certs/ echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt certutil -L -d /root/.certs
cd /root/.certs certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt
#返回如下提示即可: Notice: Trust flag u is set automatically if the private key is present.
測試
#測試 mailx -s 「郵箱測試」 [email protected] < "hello world"
最後批次監控服務shell
#建立紀錄檔檔案
touch fail.txt touch success.txt vim start.sh
#!/bin/bash
#目的ip 埠 服務名稱
./main.sh ip prot XXXX &
./main.sh ip prot XXXX &
./main.sh ip prot XXXX &
./main.sh ip prot XXXX &
轉載請備註原文連結!