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