最近公司須要在Linux下監控tomcat的服務,一旦tomcat服務存在異常或者宕機,重啓tomcat保證服務的正常運行,因爲Linux下有Shell腳本能夠實現此效果,就沒有考慮用Java代碼寫了,下面是Linux下shell腳本監控Tomcat的狀態並實現自動啓動的步驟。javascript
1編寫Shell腳本monitor.sh:
此腳本代碼參考於張小凡vip的博客https://blog.csdn.net/zzq900503/article/details/50723191html
#!/bin/shjava
# func:自動監控tomcat腳本而且執行重啓操做
# author:EagleHao
# date:2018-04-08
# DEFINEshell
# 獲取tomcat進程ID(其中[grep -w 'tomcat']代碼中的tomcat須要替換爲你的tomcat文件夾名)
TomcatID=$(ps -ef |grep tomcat |grep -w 'tomcat'|grep -v 'grep'|awk '{print $2}')apache
# tomcat啓動程序(這裏注意tomcat實際安裝的路徑)
StartTomcat=/usr/local/tomcat/bin/startup.sh
TomcatCache=/usr/local/tomcat/work緩存
#定義要監控的頁面地址
WebUrl=http://localhost:8080tomcat
#日誌輸出
GetPageInfo=/tmp/TomcatMonitor.Info
TomcatMonitorLog=/tmp/TomcatMonitor.logbash
Monitor()
{
echo "[info]開始監控tomcat...[$(date +'%F %H:%M:%S')]"
if [ $TomcatID ];then #這裏判斷Tomcat進程是否存在
echo "[info]當前tomcat進程ID爲:$TomcatID,繼續檢測頁面..."
# 檢測是否啓動成功(成功的話頁面會返回狀態"200")
TomcatServiceCode=$(curl -s -o $GetPageInfo -m 10 --connect-timeout 10 $WebUrl -w %{http_code})
if [ $TomcatServiceCode -eq 200 ];then
echo "[info]頁面返回碼爲$TomcatServiceCode,tomcat啓動成功,測試頁面正常"
else
echo "[error]tomcat頁面出錯,請注意...狀態碼爲$TomcatServiceCode,錯誤日誌已輸出到$GetPageInfo"
echo "[error]頁面訪問出錯,開始重啓tomcat"
kill -9 $TomcatID # 殺掉原tomcat進程
sleep 3
rm -rf $TomcatCache # 清理tomcat緩存
$StartTomcat
fi
else
echo "[error]tomcat進程不存在!tomcat開始自動重啓..."
echo "[info]$StartTomcat,請稍候..."
rm -rf $TomcatCache
$StartTomcat
fi
echo "--------------------------"
}
Monitor>>$TomcatMonitorLogcurl
#######函數
在寫腳本的時候遇到了一個小問題,就是編寫的過程當中粗心,致使if的[]少了兩個空格,以下:
錯誤格式:if [$TomcatID]
正確格式:if [ $TomcatID ]
若是少了這兩個空格,腳本執行是會報錯的。
編寫完腳本後,先執行如下腳本:
./monitor.sh
1
若是報權限錯誤,須要給腳本受權
chmod 777 monitor.sh
1
腳本執行成功後,能夠去/tmp目錄下面查看日誌文件TomcatMonitor.log,若是腳本測試沒有問題,咱們開始給此腳本設置一個定時任務。
先查看系統是否安裝了crontab
若是沒有安裝,則先安裝
安裝crontab:
yum install crontabs
服務操做說明:
/sbin/service crond start[這裏寫連接內容](https://blog.csdn.net/zzq900503) //啓動服務
/sbin/service crond stop //關閉服務
/sbin/service crond restart //重啓服務
/sbin/service crond reload //從新載入配置
/sbin/service crond status //啓動服務
安裝完成後啓動crontab服務,若是有以下提示(Centos7以上版本),則按照提示啓動服務便可
crontab服務啓動沒問題後,運行crontab –e 編寫一條定時任務 * * * * * /usr/local/monitor.sh 在每1分鐘執行一次monitor.sh腳本。
而後從新啓動crontab服務,這時再去/tmp下面查看日誌文件TomcatMonitor.log,測試結果。
接下來將crontab設爲開機啓動chkconfig --level 35 crond on,若是有以下提示(Centos7以上版本),則按照提示設置便可
至此整個監控tomcat服務的腳本已經完成,如下是代碼解析:
ps -e //顯示全部進程
ps -f //按樹狀顯示
grep tomcat //只取含有tomcat的行
grep -w 'apache-tomcat-5.5.23' //-w選項搜索一個單詞,而且避免搜索到詞中的部分字串。 搜索含有apache-tomcat-5.5.23的行
grep -v 'grep' //去掉含有grep的行
awk '{print $2}' //用空格切分 取第二列
ps -ef |grep tomcat |grep -w 'apache-tomcat-5.5.23'|grep -v 'grep'|awk '{print $2}' //獲取tomcat的進程id
可是僅僅是 tomcat進程存在是不夠的,須要訪問下 站點頁面看看 是否訪問正常 正常狀態爲200 經過curl
curl -s -o $GetPageInfo -m 10 --connect-timeout 10 $WebUrl -w %{http_code} //訪問頁面並保存頁面內容返回狀態碼
-s --silent //靜默模式,就是不顯示錯誤和進度
-o $GetPageInfo //將文件保存到本地並命名爲$GetPageInfo
-m //表示獲取網頁的最長時間(數據傳輸的最大容許時間)
-m 10 //表示若是10秒內沒法完成獲取網頁源碼的操做,則放棄
--connect-timeout //鏈接超時時間
--connect-timeout 10 //表示若是10秒內沒法鏈接,則放棄
$WebUrl //就是咱們要訪問的頁面路徑變量
-w //curl的-w參數咱們能夠自定義curl的輸出,%{http_code}表明http狀態碼
若是狀態碼爲200則 tomcat正常,不然 kill 殺掉tomcat 進程, 訪問tomcat的啓動腳本 start.sh 啓動tomcat
再是crontab解析
crontab –e //編寫一條定時任務
crontab -l //列出當前用戶定時任務
crontab -r //刪除當前用戶定時任務
crontab文件格式:
* * * * * command
minute hour day month week command
分 時 天 月 星期 命令
minute: 表示分鐘,能夠是從0到59之間的任何整數。
hour:表示小時,能夠是從0到23之間的任何整數。
day:表示日期,能夠是從1到31之間的任何整數。
month:表示月份,能夠是從1到12之間的任何整數。
week:表示星期幾,能夠是從0到7之間的任何整數,這裏的0或7表明星期日。
command:要執行的命令,能夠是系統命令,也能夠是本身編寫的腳本文件。
星號(*):表明全部可能的值,例如month字段若是是星號,則表示在知足其它字段的制約條件後每個月都執行該命令操做。
逗號(,):能夠用逗號隔開的值指定一個列表範圍,例如,「1,2,5,7,8,9」。
中槓(-):能夠用整數之間的中槓表示一個整數範圍,例如「2-6」表示「2,3,4,5,6」。
正斜線(/):能夠用正斜線指定時間的間隔頻率,例如「0-23/2」表示每兩小時執行一次。同時正斜線能夠和星號一塊兒使用,例如*/10,若是用在minute字段,表示每十分鐘執行一次。
參考資料:
https://blog.csdn.net/zzq900503/article/details/50723191
https://www.cnblogs.com/zoulongbin/p/6187238.html
https://blog.csdn.net/weixin_41004350/article/details/78492367?locationNum=10&fps=1
---------------------
https://jsczxy2.iteye.com/blog/2170658
檢測邏輯:連續3次訪問tomcat提供的接口,若3次響應碼都不爲200,則自動重啓tomcat
腳本內容:
#!/bin/bash source /etc/profile IP=10.78.1.183 PORT=8114 TOMCAT_DIR=/soft/tomcat_8114 #定義發送郵件函數 function send_mail(){ maillist=( zhengwei.liu@xxx.cn ) DATE=`date +'%F %T'` SUBJECT="${IP}的${PORT}端口發生故障,已自動重啓!" CONTENT="時間:${DATE}\n主機:${IP}\n事件:${PORT}端口發生重啓" for mail in ${maillist[*]};do echo -e "${CONTENT}" | mail -s "${SUBJECT}" $mail done } #對接口訪問3次 declare -i NUM=0 for i in `seq 1 3`;do CODE=$(/usr/bin/curl -I -m 10 -o /dev/null -s -w %{http_code}"\n" http://${IP}:${PORT}) if [ $CODE == "000" ];then ((NUM++)) fi sleep 3 done #根據NUM的值來肯定是否重啓tomcat,NUM=3時進行重啓 if [ $NUM == 3 ];then IS_LIVING=`jps -m -l -v | grep "${PORT}" | wc -l` if [ ${IS_LIVING} -eq 1 ];then PID=`jps -m -l -v | grep "${PORT}" | awk '{print $1}'` kill -9 $PID ${TOMCAT_DIR}/bin/startup.sh elif [ ${IS_LIVING} -eq 0 ];then ${TOMCAT_DIR}/bin/startup.sh fi send_mail fi
任務計劃:每5分鐘檢測一次
*/5 * * * * /server/scripts/tomcat/check_8114.sh &> /dev/null