shell實現web服務進程監控並自動重啓

1、目的需求前端

       根據業務須要,目前負責維護的產品形式基本是屬於分佈式的,有多個web服務部署在不一樣項目現場,針對這些web服務的維護就成了比較麻煩的事情。爲了保障系統服務,以前已經採用LNMP+zabbix的方案搭建了一套web服務監控系統,能夠方便的查看各項目的web服務狀態,方便及時發現問題並解決。java

採用Grafana的前端監控界面(比zabbix自帶的圖表好看點 - -):web

web服務監控

 

 

 

 

 

 

 

 

 

 

不過雖然有zabbix貼心的監控和提醒(實際上因爲網絡不穩定或等等玄學因素,冗餘警告很是多,多了就煩了。。。),可是解決具體問題仍是須要遠程到項目現場進行,特別是一些進程運行時間久了以後的異常,或者數據庫鏈接斷開等,簡單重啓一下web服務便可解決。可是,多了頻繁了以後就很浪費時間了,因而打算經過shell來監控各項目地的web服務並實現異常自動重啓,做爲程序猿,固然要用代碼來偷懶啦~(懶惰是三大生產力之一)shell

 

2、分析過程數據庫

思路以下:bash

1.定時執行monitor監控腳本,獲取服務狀態;服務器

2.monitor功能:網絡

  if:web服務異常curl

        restart web服務分佈式

   else:皆大歡喜

邏輯很簡單清楚,貌似很容易,不過這裏有一個問題,如何斷定web服務異常?

根據實際經驗,異經常見緣由共以下幾種:

1.web服務進程莫名掛掉;

2.web服務數據庫鏈接失敗,屢次嘗試後掛起;

3.項目地網絡出現波動;(不用吐槽,教育網還有偏遠地區是這樣的,指不定哪天光纖被挖斷或者交換機故障(╯▽╰))

對應解決方案:

1.判斷進程是否存在,不存在則重啓web服務;

2.這個直接經過shell很差判斷,借鑑了以前在zabbix作http監控時的方法,經過模擬登陸的方式,登陸一個測試頁面,獲取http_code,若200則正常,非200則屬於異常。

3.這個能夠經過判斷本地服務,若是本地訪問無問題則正常。

 

3、代碼實現

monitor邏輯分析清楚了,能夠開始進行了,其中模擬登陸使用curl來獲取http_code。

#! /bin/sh  
  
host_dir="/opt/ybg/"                                       # 當前用戶根目錄  
proc_name="java"                                        # 進程名  
file_name="monitor.log"               # 日誌文件  
pid=0  
  
proc_num()                                              # 計算進程數  
{  
    num=`ps -ef | grep $proc_name | grep -v grep | wc -l`  
    return $num  
}  
  
proc_id()                                               # 進程號  
{  
    pid=`ps -ef | grep $proc_name | grep -v grep | awk '{print $2}'`  
}  
# 經過curl模擬登陸獲取http_code,模擬登陸參數僅供參考
# 若是隻須要判斷某頁面的狀態可以使用curl -I -s -w "%{http_code}" -o /dev/null http://www.baidu.com/ 直接獲取便可
http_code=`curl -I -s -w "%{http_code}" -o -d "userKey=admin&pass=c9127e832b41a" /dev/null  http://portal.ly-sky.com/login.do?login= | head -n 1 | cut -d$' ' -f2`  

proc_num  
number=$?  
if [[ $number -eq 0 ]]||[[ $http_code -ne 200 ]]          # 判斷進程是否存在  
then   
    cd /opt/ybg/URP/bin/
    nohup ./run.sh>../logs/urp.log 2>&1 &    # 重啓進程的命令,請相應修改  
    sleep 3                                  #延遲3秒是爲了確保進程已正常啓動並方便獲取pid,不然有可能獲取不到pid
	proc_id                                         # 獲取新進程號  
    echo $pid, `date` >> $host_dir$file_name      # 將新進程號和重啓時間記錄  
fi

執行成功的日誌記錄:

記錄了PID和啓動時間,前面幾條就是由於未加入sleep獲取Pid失敗,顯示爲空了

部署到服務器後只須要在crontab添加任務,定時執行就好了:

[root@localhost ybg]# crontab -e  


#添加web服務監控,每5分鐘一次,可根據實際要求修改監控頻率
*/5 * * * * /opt/ybg/monitor.sh

添加完畢後,能夠手動kill -9 pid來測試監控是否正常運行。提示:測試時注意生產環境哦,若是服務宕了被老闆請去喝茶就很差啦~✧(≖ ◡ ≖✿)

相關文章
相關標籤/搜索