Windows下.bat脚本文件监控java进程
- 场景
- 大体上的程序不改变,部分方法做了调整,不清楚是否是环境不同还是原本方法有问题
- 简单介绍下语法-没做研究,纯自己理解
- 直接来代码,应该能看懂
- monitor-net.bat
- kill-process.bat
- jar-start.bat
- 另一种对redis的特殊处理
- 端口整合版
- 优化接口整合版
场景
公司服务莫名会崩溃,但有不能实时去人力盯着,没有完备的监控系统,只能先写脚本支撑下
脚本参考自: 博客.
java程序参考自:博客2 .bat发送请求参考自:博客3 材料准备,本地(Window10)安装redis以及打包一个java程序
大体上的程序不改变,部分方法做了调整,不清楚是否是环境不同还是原本方法有问题
简单介绍下语法-没做研究,纯自己理解
echo: 相当于打印输出语句:next 相当于声明一个next函数,但又完全不太一样,可以理解为存档点,整个代码自上而下运行,这个标志了整段程序的一个节点goto 和上边的联合使用就是将程序运行转向标志,这里就利用这个做循环监听
:: 这个就是.bat脚本文件里的注释
call 执行另一个.bat文件 --这里是同级目录下
start “开启服务” cmd /k call jar-start.bat 这个主要是再开一个窗口执行,本地不再开的话,就停到java运行里卡住不动了,多次实验还是再开一个窗口执行会好些
直接来代码,应该能看懂
monitor-net.bat
这里redis可以再改进下,或写个java内置的使用redis的接口,访问超时一并重启,太麻烦就不写了,这里测试redis服务正常运行中再执行strart redis服务,数据也还行,当然总感觉不保险
@echo off
:: 设置窗体背景颜色
color 1f
:: 设置窗体标题
title 正在监控http://localhost:8080
echo 正在监控 http://localhost:8080
:next
for /f %%a in ('powershell -command "& {try { $response = Invoke-WebRequest http://localhost:8080/hello;$Response.StatusCode} catch {$_.Exception.Response.StatusCode.Value__}}"') do (
set statusCode=%%a
)
echo code为:"%statusCode%"
if "%statusCode%"=="200" (
echo 在%date:~0,10% %time:~0,8% 访问正常
echo 正在监控http://localhost:8080
) else (
echo 在%date:~0,10% %time:~0,8% 无法正常访问,杀掉对应的进程
:: call-执行完返回往下执行
call kill-process.bat
echo 在%date:~0,10% %time:~0,8% 无法正常访问,重启中...
start "开启服务" cmd /k call jar-start.bat
:: start jar-start.bat
echo 在%date:~0,10% %time:~0,8% 重启成功
)
:: 休眠15秒
echo 开始休眠
choice /t 15 /d y /n >nul
::start D:\Redis-x64-3.0.504\redis-server.exe
goto next
kill-process.bat
基本没变,因为基本没用到,
@echo off
:: 设置窗体背景颜色
:: color 1f
:: 设置窗体标题
title 根据端口杀死进程
set port=8080
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do echo 准备杀死进程:%%m &taskkill /f /pid %%m &goto :end
:end
jar-start.bat
这个也没什么好说的,绝对路径 @echo off 去掉输出的意思
@echo off
java -jar C:/Users/断桥残雪/Desktop/监控文件/study-0.0.1-SNAPSHOT.jar
整体运行起来是这样的
另一种对redis的特殊处理
最简单方法其实就是上面java宕机后先重启redis再启动java,也就是将两者结合起来,这边查了资料,可以将redis注册成服务的方式来进行监控,具体代码就是
@echo off
rem 定义循环间隔时间和监测的服务:
set srvname="redis"
echo.
echo ========================================
echo == 查询计算机服务的状态, ==
echo == 每间隔10秒种进行一次查询, ==
echo == 如发现其停止,则立即启动。 ==
echo ========================================
echo.
echo 此脚本监测的服务是:%srvname%
echo.
if %srvname%. == . goto end
:chkit
set svrst=0
for /F "tokens=1* delims= " %%a in ('net start') do if /I "%%a %%b" == %srvname% set svrst=1
if %svrst% == 0 net start %srvname%
set svrst=
rem 下面的命令用于延时,否则可能会导致cpu单个核心满载。
choice /t 10 /d y /n >nul
goto chkit
:end
具体如何将redis写成服务参考博客4 简单来说cmd 到redis安装根目录运行
redis-server --service-install redis.windows.conf
需要注意的是检测服务提示是需要权限的,试过将这个和java整合,就以管理员运行时报错,提示目录找不到,分开也无所谓,各监控各的,也挺好,
端口整合版
call 文件都可以在上面找到
@echo off
setlocal enabledelayedexpansion
title 端口监控
c:
cd \Users\断桥残雪\Desktop\监控文件\2\新建文件夹
:again
set /a RedisPortNum="0"
set redisPort=6379
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%redisPort%"') do echo 监听到进程redis:%%m & set /a RedisPortNum = %%m
if "%RedisPortNum%" == "0" (
echo Redis services is not running %Date:~0,4%-%Date:~5,2%-%Date:~8,2% %Time:~0,2%:%Time:~3,2% >> log.txt
echo java在%date:~0,10% %time:~0,8% 无法正常访问,重启中...
start D:\Redis-x64-3.0.504\redis-server.exe
echo 在%date:~0,10% %time:~0,8% 重启成功
) else (
echo 6379端口在%date:~0,10% %time:~0,8% 正常
)
choice /t 10 /d y /n >nul
set /a javaPortNum="0"
set javaPort=8080
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%javaPort%"') do echo 监听到进程java:%%m & set /a javaPortNum = %%m
if "%javaPortNum%" == "0" (
echo Java services is not running %Date:~0,4%-%Date:~5,2%-%Date:~8,2% %Time:~0,2%:%Time:~3,2% >> log.txt
echo java在%date:~0,10% %time:~0,8% 无法正常访问,重启中...
start "开启服务" cmd /k call jar-start.bat
echo 在%date:~0,10% %time:~0,8% 重启成功
) else (
echo 8080端口在%date:~0,10% %time:~0,8% 正常
)
choice /t 60 /d y /n >nul
goto again
优化接口整合版
实际运行中,很尴尬得一点就是一个端口能查出不同pid,导致pid存在,但服务是不通的情况,这就很尬了,考虑还是走接口,基本思路是这样的(不走自定义状态码)
- java项目中写个接口访问redis服务,
- 访问接口得到状态码
- 状态码- 没有获取到默认java服务宕机
- 状态码-500 redis服务宕机
- 状态码-200 服务正常
@echo off
:: 设置窗体背景颜色
color 1f
:: 设置窗体标题
title 正在监控http://localhost:8080/redis
echo 正在监控 http://localhost:8080/redis
c:
cd \Users\断桥残雪\Desktop\监控文件\2\新建文件夹
echo 进入文件夹
:next
set statusCode=0
for /f %%a in ('powershell -command "& {try { $response = Invoke-WebRequest http://localhost:8080/redis;$Response.StatusCode} catch {$_.Exception.Response.StatusCode.Value__}}"') do (
set statusCode=%%a
)
echo code为:%statusCode%
if %statusCode%==200 (
echo 在%date:~0,10% %time:~0,8% 访问正常
echo 正在监控http://localhost:8080
) else if %statusCode%==500 (
echo 在%date:~0,10% %time:~0,8% redis服务宕机 >> log.txt
call kill-process-redis.bat
start D:\Redis-x64-3.0.504\redis-server.exe
)else (
echo 在%date:~0,10% %time:~0,8% java服务挂掉 >> log.txt
call kill-process.bat
call kill-process-redis.bat
echo redis在%date:~0,10% %time:~0,8% 无法正常访问,重启中...
start D:\Redis-x64-3.0.504\redis-server.exe
choice /t 5 /d y /n >nul
start "开启服务" cmd /k call jar-start.bat
echo 在%date:~0,10% %time:~0,8% 重启成功
)
:: 休眠15秒
echo 开始休眠
choice /t 15 /d y /n >nul
::start D:\Redis-x64-3.0.504\redis-server.exe
goto next