shell郵件功能-2

stuka發表於2024-03-06

場景:應用服務域名對應多臺負載機,當某臺出現CPU或RAM資源阻塞時,如果伺服器並未當機,根據負載策略(類似 ping或telnet),伺服器可能仍然是可用的,新的訪問仍然有分配到這臺機器處理的可能,但實際又不可用,體驗不好,且不能及時傳送故障通知。新的負載策略是訪問指定頁面(類似curl命令),檢查返回結果中是否有關鍵字,來判斷服務是否正常,如果不正常,則從應用叢集中踢掉這臺機器,待恢復正常後再加入。但當時踢掉後沒有郵件通知功能,就做了個指令碼來監控。

  上一版指令碼在每一臺上部署,當出現機器資源耗盡時,郵件阻塞,出現重複傳送的情況,故而改進了一下指令碼,將其部署到一臺不提供負載的伺服器上。

1.通知指令碼-notice.sh

 1 #!/bin/bash
 2 dir=/root/myhome
 3 hosts=("192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4")
 4 keyword="記住使用者"
 5 users=("11@qq.com 22@qq.com")
 6 
 7 # 傳送郵件的函式
 8 send_email() {
 9 to=$users
10 subject="$j service unreachable"
11 body="URL: $url\n服務異常,\n斷言關鍵字: $keyword\n"
12 echo -e "$body" | mail -s "$subject" "$to"
13 }
14 
15 disable_flag(){
16 sed -i "s/$j=\(y\)/$j=n/" "$dir/s.flag"
17 echo "`date`:$j===>>>alter flag to n"
18 }
19 
20 enable_flag(){
21 sed -i "s/$j=\(n\)/$j=y/" "$dir/s.flag"
22 echo "`date`:$j===>>>alter flag to y"
23 }
24 
25 # 使用 curl 請求 URL 並檢查返回結果是否包含關鍵字
26 for j in $hosts;do
27 sendFlag=`cat $dir/s.flag | grep ^$j | rev | cut -c 1`
28 if [[ $sendFlag = y ]];then
29 url="http://$j:8888/mydemo/home"
30 response=$(curl -s "$url")
31 if [[ $response =~ $keyword ]];then
32 echo "`date`:$j===>>>curl 找到關鍵字"
33 else
34 echo "`date`:$j===>>>curl 未找到關鍵字"
35 disable_flag
36 for i in "$users"
37 do
38 send_email
39 done
40 fi
41 else
42 echo "`date`:$j===>>>傳送標誌是$sendFlag,不再重複傳送"
43 fi
44 done

2.開啟傳送標誌的shell

 1 #!/bin/bash
 2 hosts=("192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4")
 3 dir=/root/myhome
 4 enable_flag(){
 5 sed -i "s/$j=\(n\)/$j=y/" "$dir/s.flag"
 6 echo "`date`:$j===>>>alter flag to y"
 7 }
 8 
 9 for j in $hosts;do
10 sendFlag=`cat $dir/s.flag | grep ^$j | rev | cut -c 1`
11 if [[ $sendFlag = n ]];then
12 enable_flag
13 else
14 echo "`date`:$j===>>> flag is y,nothing to do"
15 fi
16 done

3. s.flag檔案內容

192.168.1.1=y
192.168.1.2=y
192.168.1.3=y
192.168.1.4=y

4.crondtab配置

*/2 3-23,0-1 * * * sh /root/myhome/notice2.sh >> /root/myhome/check.log 2>&1
0 7 * * * sh /root/myhome/enable_flag.sh >> /root/myhome/check.log 2>&1

相關文章