您的位置:首页 > 运维架构 > Shell

shell实现web服务进程监控并自动重启

2017-02-09 00:00 591 查看
摘要: web服务进程监控、shell

一、目的需求

根据业务需要,目前负责维护的产品形式基本是属于分布式的,有多个web服务部署在不同项目现场,针对这些web服务的维护就成了比较麻烦的事情。为了保障系统服务,之前已经采用LNMP+zabbix的方案搭建了一套web服务监控系统,可以方便的查看各项目的web服务状态,方便及时发现问题并解决。

采用Grafana的前端监控界面(比zabbix自带的图表好看点 - -):



不过虽然有zabbix贴心的监控和提醒(实际上由于网络不稳定或等等玄学因素,冗余警告非常多,多了就烦了。。。),但是解决具体问题还是需要远程到项目现场进行,特别是一些进程运行时间久了之后的异常,或者数据库连接断开等,简单重启一下web服务即可解决。但是,多了频繁了之后就很浪费时间了,于是打算通过shell来监控各项目地的web服务并实现异常自动重启,作为程序猿,当然要用代码来偷懒啦~(懒惰是三大生产力之一)

二、分析过程

思路如下:

1.定时执行monitor监控脚本,获取服务状态;

2.monitor功能:

if:web服务异常

restart web服务

else:皆大欢喜

逻辑很简单清楚,貌似很容易,不过这里有一个问题,如何判定web服务异常?

根据实际经验,异常常见原因共如下几种:

1.web服务进程莫名挂掉;

2.web服务数据库连接失败,多次尝试后挂起;

3.项目地网络出现波动;(不用吐槽,教育网还有偏远地区是这样的,指不定哪天光纤被挖断或者交换机故障(╯▽╰))

对应解决方案:

1.判断进程是否存在,不存在则重启web服务;

2.这个直接通过shell不好判断,借鉴了之前在zabbix做http监控时的方法,通过模拟登录的方式,登录一个测试页面,获取http_code,若200则正常,非200则属于异常。

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来测试监控是否正常运行。提示:测试时注意生产环境哦,如果服务宕了被老板请去喝茶就不好啦~✧(≖ ◡ ≖✿)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ShellPage