Windows下.bat脚本文件监控java进程

场景

公司服务莫名会崩溃,但有不能实时去人力盯着,没有完备的监控系统,只能先写脚本支撑下
脚本参考自: 博客.
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存在,但服务是不通的情况,这就很尬了,考虑还是走接口,基本思路是这样的(不走自定义状态码)

  1. java项目中写个接口访问redis服务,
  2. 访问接口得到状态码
  3. 状态码- 没有获取到默认java服务宕机
  4. 状态码-500 redis服务宕机
  5. 状态码-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
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值