程序监控报警失败自动重启脚本
Posted 第一片心意
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序监控报警失败自动重启脚本相关的知识,希望对你有一定的参考价值。
1. 用途
运行在服务器上的一些组件服务,比如大数据的 hadoop、hive、hbase,或者是自己写的一些需要长时间运行的程序,我们启动了之后,是不会经常去观察这些程序的运行状态的。正常情况下这是没问题的,但有时候,程序在运行过程中,会由于机器的负载,或者是其他的一些环境不稳定因素,到会程序停止运行。如果我们没有设计什么监控的话,只能在出现问题时,登录机器查看组件或程序运行的情况,这是非常被动的,如果影响到业务,会更严重,所以我们需要增加一些组件或程序运行的监控、报警和失败重启脚本。
2. 方案
2.1. supervisor
这是一种很成熟的方案,只需要按照人家的格式新建或修改配置文件就行。
不过我的机器上都部署了 CDH,而且 CDH 里面内置了 supervisor,所以自己再安装一份 supervisor 的话,涉及到修改配置文件之类的,会有一些风险,所以我们舍弃了这种方案。
2.2. shell脚本+crontab
另一种方案就是编写 shell 脚本,然后配置到 crontab 里面。
2.2.1. 监控脚本
下面是监控程序运行情况,并在失败时触发钉钉报警、重启程序的代码实例,脚本文件名为 service-monitor.sh
:
#!/bin/bash
# 在脚本最开头,加载一下 profile 文件,如果下面需要启动程序用到了 java,脚本最开头没有加载 profile 文件的话,会找不到 java 环境,然后无法启动对应的服务,而且还不会报错。
source /etc/profile
# cloudera-scm-server 服务运行检测
pid=$(ps -ef | grep 'cloudera-scm-server' | grep -v grep | awk 'print $2')
if [ -z "$pid" ]; then\\
# 钉钉报警,按照钉钉官网进行钉钉群机器人创建、发送 post 请求即可。
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxx' \\
-H 'Content-Type: application/json' \\
-d '"msgtype": "text","text": "content":"运行服务报警:hadoop01 节点上 cloudera-scm-server 服务进程不存在"'
echo -e "`date +'%Y-%m-%d %H:%M:%S'` 未检测到 cloudera-scm-server 服务,开始重启"
# 这儿是启动对应服务的脚本
systemctl start cloudera-scm-server
echo -e "`date +'%Y-%m-%d %H:%M:%S'` cloudera-scm-server 服务重启完成"
else
echo -e "`date +'%Y-%m-%d %H:%M:%S'` 成功检测到 cloudera-scm-server 服务"
fi
echo -e ""
exit 0
一定要给脚本文件添加可执行权限:
chmod +x service-monitor.sh
下面是设置的 crontab 代码示例,每 10 秒执行一次脚本:
# 自动检测机器上的组件角色运行情况并重启挂掉的服务
*/1 * * * * sh /root/script/service-monitor.sh &>> /root/script/service-monitor.log
*/1 * * * * sleep 10 && sh /root/script/service-monitor.sh &>> /root/script/service-monitor.log
*/1 * * * * sleep 20 && sh /root/script/service-monitor.sh &>> /root/script/service-monitor.log
*/1 * * * * sleep 30 && sh /root/script/service-monitor.sh &>> /root/script/service-monitor.log
*/1 * * * * sleep 40 && sh /root/script/service-monitor.sh &>> /root/script/service-monitor.log
*/1 * * * * sleep 50 && sh /root/script/service-monitor.sh &>> /root/script/service-monitor.log
需要注意,里面所有的文件,都必须是绝对路径。
2.2.2. 日志清理脚本
由于上面配置的 crontab,把脚本运行的日志全部写入了日志文件,如果不定时清理,日志文件会一直增长。
#!/bin/bash
rm -f /root/script/service-monitor-week.log
mv /root/script/service-monitor.log /root/script/service-monitor-week.log
exit 0
然后配置 crontab:
# 每周周一清理上面监控脚本的日志文件
0 0 * * MON sh /root/script/log-clear.sh
可以从 crontab guru 这个网站根据提示生成自己的 crontab 表达式来定时调用日志清理脚本。
WINDOWS程序监控及故障自动重启思路及bat脚本实现
最近一套老系统运营过程中经常发生程序进程自动关闭,由于系统没有开发人员进行维护,无法通过修改代码实现程序bug处理。因此考虑自己写段脚本进行自动监控及故障自动恢复。现象
有个程序会自动关闭,另外一个程序可能有BUG,这个程序会导致数据库死锁。
处理思路:
1、数据库监控:对数据库写入数据进行监控,对写入记录少于一定量进行异常报出;
2、对于进程进行监控及重启,查询到没有进程时,直接重启进程。
3、发现监控数据库时,有时数据库也会因死锁,导致查询不到数据,对查询数据库进行判断,当返回数据库查询异常时重启数据库服务。
脚本实现
1、数据库监控(vb脚本)gn2.vbs:
Function Format_Time(s_Time)
Dim y, m, d, h, mi, s
Format_Time = ""
If IsDate(s_Time) = False Then Exit Function
y = cstr(year(s_Time))
m = cstr(month(s_Time))
If len(m) = 1 Then m = "0" & m
d = cstr(day(s_Time))
If len(d) = 1 Then d = "0" & d
h = cstr(hour(s_Time))
If len(h) = 1 Then h = "0" & h
mi = cstr(minute(s_Time))
If len(mi) = 1 Then mi = "0" & mi
s = cstr(second(s_Time))
If len(s) = 1 Then s = "0" & s
Format_Time = y & "-" & m & "-" & d & " " & h & ":" & mi & ":" & s
End Function
‘数据库连接字符串
Dim DBConnStr
DBConnStr = "PROVIDER=SQLOLEDB;DATA SOURCE=111.111.222.222,1433;UID=sa;PWD=1122aa.0;DATABASE=database"
Dim v_DBRecordSet
Dim v_DBRecCnt
Dim v_CheckTime
‘计算查询时间 当前时间往前5分钟
v_CheckTime = DateAdd("n",-5,now())
v_DBRecCnt = 0
‘创建记录集对象
On Error Resume Next
Set v_DBRecordSet=CreateObject("ADODB.Recordset")
If Err.Number Then
WScript.Echo "Message:" & Err.Description
WScript.Quit(1)
End If
‘初始化记录集参数
v_DBRecordSet.CursorType = 0
v_DBRecordSet.CursorLocation = 2
v_DBRecordSet.LockType = 1
v_DBRecordSet.Source = "Select count(*) as CN from RunLog where SysDatetime >‘" & Format_Time(v_CheckTime) & "‘"
On Error Resume Next
v_DBRecordSet.ActiveConnection = DBConnStr
If Err.Number Then
WScript.Echo "Message:" & Err.Description
WScript.Quit(1)
End If
On Error Resume Next
v_DBRecordSet.Open()
If Err.Number Then
WScript.Echo "Message:" & Err.Description
WScript.Quit(1)
End If
On Error Resume Next
v_DBRecCnt = v_DBRecordSet.Fields("CN")
If Err.Number Then
WScript.Echo "Message:" & Err.Description
WScript.Quit(1)
End If
‘如果等于0,则报警
if CInt(v_DBRecCnt) >100 Then
‘关闭记录集
v_DBRecordSet.Close()
Set v_DBRecordSet = Nothing
‘正常退出
WScript.Echo "前5分钟存储条数:" & v_DBRecCnt
WScript.Quit(0)
else
‘关闭记录集
v_DBRecordSet.Close()
Set v_DBRecordSet = Nothing
‘异常退出
WScript.Echo "前5分钟存储条数:" & v_DBRecCnt
WScript.Quit(1)
end if
2、监控数据库及重启服务相关脚本(bat脚本):
setlocal enabledelayedexpansion
cscript //nologo c:gn2.vbs
If ERRORLEVEL 1 (net stop SQLSERVERAGENT
net stop MSSQLSERVER
PING 172.18.18.2 -n 2
net start MSSQLSERVER
net start SQLSERVERAGENT
echo %date:~0,10% %time:~0,8% Restart MSSQLSERVER Service >>c:RESTART_GN.txt ) else goto check_gn_carrunlog
:check_gn_carrunlog
set /a carrunlog2data=0
PING 172.18.18.2 -n 50
for /f "delims=" %%! in (‘cscript //nologo c:gn2.vbs‘) do set /a carrunlog2data =%%!
if "%carrunlog2data%" leq "0" (
call RESTART_GN.bat)
else exit
3、自动监控进程及重启进程脚本(bat脚本):
setlocal enabledelayedexpansion
echo ############################时时监控,请勿关闭!#########################
ping 172.18.18.2 -n 10
tasklist /nh|find /i "w3wp.exe"
If ERRORLEVEL 1 (start C:webweb通信服务器w3wp.exe
echo %date:~0,10% %time:~0,8% Restart w3wp.exe >>c:Restart_WEB.txt
) else exit
4、为定期执行以上脚本,原计划通过开机自动执行,但考虑偶尔会有人工重启程序,改为通过WINDOWS 计划任务定期(5分钟或10分钟)调用执行,目前执行效果较好。
以上是关于程序监控报警失败自动重启脚本的主要内容,如果未能解决你的问题,请参考以下文章