shell埠監聽異常郵箱告警

2023-01-10 15:02:51

  業務場景:應用釋出監聽服務是否正常啟動,因為伺服器資源不夠上不了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 &

 

轉載請備註原文連結!