PS:因公司java服务有时候会出现,进程还在,但是无法正常做业务,通过该脚本对http服务状态进行检测,如果返回http状态码异常,或指定时间没有返回,则重启服务。

一、通过shell脚本检测服务状态。

#!/bin/bash

#设置变量,url为你需要检测的目标网站的网址(IP或域名)
url=http://192.168.1.1:8080/SKDo

#重启脚本的位置,这里可替换为你程序自定义脚本
restart_sh=/software/script/restart.sh

#你要发送邮件给谁
mail_user=****@qq.com

#每隔多少秒检查一次
cheack_time=5

#定义函数check_http:
#使用curl命令检查http服务器的状态
#-m设置curl不管访问成功或失败,最大消耗的时间为5秒,5秒连接服务为相应则视为无法连接
#-s设置静默连接,不显示连接时的连接速度、时间消耗等信息
#-o将curl下载的页面内容导出到/dev/null(默认会在屏幕显示页面内容)
#-w设置curl命令需要显示的内容%{http_code},指定curl返回服务器的状态码
check_http(){
status_code=$(curl -m 5 -s -o /dev/null -w %{http_code} $url)
}

restart_process(){
echo "服务状态异常,状态码为: $status_code"
$restart_sh 2>&1 >  /restart.log
}
error_count=0 
while :
do
       check_http
       date=$(date +%Y%m%d-%H:%M:%S) 
#生成报警邮件的内容
       echo "当前时间为:$date
       $url服务器异常,状态码为${status_code}.
       ,即将执行重启,请尽快排查异常." > /tmp/http$$.pid
       
#指定测试服务器状态的函数,并根据返回码决定是发送邮件报警,重启服务,还是将正常信息写入日志
#error_count用来记录服务错误次数,目前只有第一次检测有问题会重启。
       if [ $status_code -ne 200 ];then
              error_count=$(( $error_count + 1 ))
	      if [ $error_count -eq 1 ];then
              		mail -s "Warning-您的服务: $url 发生故障,正在重启!" $mail_user < /tmp/http$$.pid
              		restart_process
	      fi
              echo  " $(date +%Y/%m/%d-%H:%M:%S) 错误的次数为: $error_count" >> /var/log/http.log
       else
	      if [ $error_count -ne 0 ];then
                  echo "ok" | mail -s "Warning-您的服务: $url 已经恢复!状态码: $status_code " $mail_user 
                   
              fi
              error_count=0
              echo "$(date +%Y/%m/%d-%H:%M:%S) $url连接正常" >> /var/log/http.log
       fi
       sleep $cheack_time
done

二、重启java服务脚本

export LANG=zh_CN.UTF-8
export JAVA_HOME=/software/jdk1.7.0_80
export JRE_HOME=$JAVA_HOME/jre

#上面定义路径均不需要/
export CATALINA_BASE=/software/apache-tomcat-8080-8005-8009
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$CATALINA_BASE/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export kill_press=/software/apache-tomcat-8080-8005-8009
echo "[$(date +'%F %T')] >>> Tomcat begin to restart."
pidList=$(ps aux | grep $kill_press | grep -v grep | awk '{print $2}')
for pid in $pidList; do
        kill -9 $pid   
        echo "[$(date +'%F %T')] >>> Kill the process [$pid] successfully."
done
sleep 1
export xc=$(ps aux | grep $kill_press | grep -v grep | awk '{print $2}')
echo "$xc"
$CATALINA_BASE/bin/shutdown.sh
sleep 1
# Kill all remaining processes
set -u 
set -e
#删除temp文件
rm -rf "$CATALINA_BASE"/temp/
mkdir "$CATALINA_BASE"/temp/
#echo "$CATALINA_BASE"temp/ > /test

$CATALINA_BASE/bin/startup.sh 
echo "[$(date +'%F %T')] >>> Tomcat restart complete."

三、主机邮件推送配置(可去申请163免费邮箱)

1、修改   vim /etc/mail.rc 文件, 末尾增加:

set from=****@163.com     # (你的163邮箱)
set smtp=smtps://smtp.163.com:465     # (163邮箱默认就用这个),阿里云需要需改为 465带你看
set smtp-auth-user=***@163.com    # (与第一行的一致)
set smtp-auth-password=OZWKUVFBNWZBEMJR    # (这里等号后面填写的是163邮箱的客户端授权密码)
set smtp-auth=login  #   (登录方式)
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/


2、测试发送:

echo "TEST" | mail -s "Title" yyy@qq.com

3、如果不行关闭以下几个服务在尝试。
systemctl stop sendmail.service 
systemctl disable sendmail.service 
systemctl stop postfix.service
systemctl disable postfix.service