Windows使用bat脚本实现软件进程检测(服务守护进程)

[全站通告]付费处理问题,非诚勿扰,付出才有收获;有意加微信 2589053300 进行沟通处理

写这篇文章还是前段时间因为一个守护进程的事儿,一直想着如何能处理更简洁,有想用软件的,有喜欢Bat的,不过不管是哪种方式,只要能解决问题才是最好的;

Windows进程监控(守护)小工具(Process Monitor)以及其他小软件-Bat脚本实现监控进程功能

下面是记录的一些手机bat脚本命令以及服务

批处理文件,在DOS和Windows(任意)系统中,.bat文件是可执行文件,由一系列命令构成,其中可以包含对其他程序的调用。这个文件的每一行都是一条DOS命令(大部分时候就好像我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。

bat实现守护 脚本代码:

@echo off

:run

:: 标题定义
title sanxingtest

:: 当前路径
set strPath=%~dp0

:: 带绝对路径的文件名
set strFile=%strPath%%date:~0,4%%date:~5,2%%date:~8,2%.log

:: 输出时间到文件
echo [%time%] >>%strFile%

:: 输出计算器的进程信息到文件
:: tasklist -nh -fo csv -fi "IMAGENAME eq WeChat.exe" >>%strFile%
tasklist -fi "IMAGENAME eq WeChat.exe" >>%strFile%

:: 下面是检查进程是否存在,不存在启动当前路径下的脚本文件1.bat
tasklist|find /i "WeChat.exe"
if %errorlevel%==0 (
	echo 微信已存在
) else (
	echo 微信不存在,启动
	start  /d"C:/Program Files (x86)/Tencent/WeChat" WeChat.exe
  	
)
:: 定时10秒
choice /t 10 /d y /n >nul

goto run

效果如下:

go start实现:

:start

choice /t 10 /d y /n >nul
tasklist|find /i " WeChat.exe" 

if %errorlevel%==0 ( 
	echo 微信已存在
) else (
	echo 微信不存在,启动
	start  /d"C:/Program Files (x86)/Tencent/WeChat" WeChat.exe
)
goto start 

小拓展

1、bat文件执行乱码问题

解:修改编码格式为ANSIode>

2、后台运行bat文件

@echo off
if "%1"=="h" goto begin
start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
::下面是你的代码。

3、linux java进程检测

#!/bin/sh
while true;do
count=`ps -ef|grep java|grep -v grep`
if [ "$?" != "0" ];then
echo "java is running"
else
echo "java is stop..."
break
fi
sleep 10
done

4、清理垃圾  命令代码如下:

@echo off
echo 正在清除系统垃圾文件,请稍等......
del /f /s /q %systemdrive%\*.tmp
del /f /s /q %systemdrive%\*._mp
del /f /s /q %systemdrive%\*.log
del /f /s /q %systemdrive%\*.gid
del /f /s /q %systemdrive%\*.chk
del /f /s /q %systemdrive%\*.old
del /f /s /q %systemdrive%\recycled\*.*
del /f /s /q %windir%\*.bak
del /f /s /q %windir%\prefetch\*.*
rd /s /q %windir%\temp & md %windir%\temp
del /f /q %userprofile%\cookies\*.*
del /f /q %userprofile%\recent\*.*
del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files\*.*"
del /f /s /q "%userprofile%\Local Settings\Temp\*.*"
del /f /s /q "%userprofile%\recent\*.*"
echo 清除系统垃圾文件完成!
pause

5、网络设置

@echo off
::判断本地连接赋值a
for /f "tokens=3,4 delims== " %%i in ('ipconfig ^|findstr /r "本"') do echo %%i %%j >DNS.txt
for /f "tokens=1 delims==:" %%d in (DNS.txt) do set a=%%d
echo 请根据实际情况更改下面三行
set slection1=
set/p slection1=请输入IP地址:
netsh interface ip set address name="%a%" source=static addr=%slection1% mask=255.255.255.0
set slection2=
set/p slection2=请输入网关地址:
netsh interface ip set address name="%a%" gateway=%slection2% gwmetric=0
set slection3=
set/p slection3=请输入主dns地址
netsh interface ip set dns name="%a%" source=static addr=%slection3% register=PRIMARY
set slection4=
set/p slection4=请输入备份dns地址
netsh interface ip add dns name="%a%" addr=%slection4%
netsh interface ip set wins name="%a%" source=static addr=none
del DNS.txt
exit 改完IP后可用这个完成本机ARP的绑定:
@echo off
if exist ipconfig.txt del ipconfig.txt
ipconfig /all >ipconfig.txt
if exist phyaddr.txt del phyaddr.txt
find "Physical Address" ipconfig.txt >phyaddr.txt
for /f "skip=2 tokens=12" %%M in (phyaddr.txt) do set Mac=%%M
if exist IPAddr.txt del IPaddr.txt
find "IP Address" ipconfig.txt >IPAddr.txt
for /f "skip=2 tokens=15" %%I in (IPAddr.txt) do set IP=%%I
arp -s %IP% %Mac%
del ipaddr.txt
del ipconfig.txt
del phyaddr.txt
exit

6、调用bat时动态传参  内容如下:

@echo off
set username = %1%
set password = %2%

start java -jar test.jar %username% %password%

7、背景颜色窗口大小设置

color 1F – 设置颜色,1F前面表示背景颜色,后面表示字体颜色,代表颜色如下:

0=黑、1=蓝、2=绿、3=浅绿、4=红、5=紫、6=黄、7=白、8=灰、9=淡蓝、A=淡绿、B=淡浅绿、C=淡红、D=淡紫、E=淡黄、F=亮白

mode con cols=100 lines=60 – 设置窗口大小,cols表示宽度,lines表示高度

windows下bat批处理实现守护进程(有日志)

实现:检查是否有notepad,要用的话就换成自己的进程名,如果进程宕了就过会自动重启(会在当前目录下生成一个start.bat)

@echo off
 
set _task=notepad.exe
set _svr=c:/windows/notepad.exe
set _des=start.bat
 
:checkstart
for /f "tokens=5" %%n in ('qprocess.exe ^| find "%_task%" ') do (
if %%n==%_task% (goto checkag) else goto startsvr
)
 
:startsvr
echo %time%
echo ********程序开始启动********
echo 程序重新启动于 %time% ,请检查系统日志 >> restart_service.txt
echo start %_svr% > %_des%
echo exit >> %_des%
start %_des%
set/p=.nul
echo .
echo Wscript.Sleep WScript.Arguments(0) >%tmp%/delay.vbs
cscript //b //nologo %tmp%/delay.vbs 10000
del %_des% /Q
echo ********程序启动完成********
goto checkstart
 
 
:checkag
echo %time% 程序运行正常,10秒后继续检查..
echo Wscript.Sleep WScript.Arguments(0) >%tmp%/delay.vbs
cscript //b //nologo %tmp%/delay.vbs 10000
goto checkstart

这个脚本提供两种方式守护:

一种是通过进程名,但对于进程名都是java.exe的java程序不适用;

另一种是通过netstat查找应用程序所监听的端口是否正在被监听。

这两种方式可以在脚本中通过两个冒号注释来选择切换。下面是设置成通过端口来守护的,当端口没被监听则打开一个zip文件,所以运行后会发现没过5秒会重复打开这个zip文件,除非这个zip文件打开后会自动监听8080端口,那当然是不可能的!脚本涉及的命令就不解释了搜一下就知道了。

@echo off
 
::检测时间间隔,单位:秒
set _interval=5
 
::需要守护的进程名称
set _processName=WinRAR
 
::需要守护的进程启动命令
set _processCmd=C:ideavim-0.32.zip
 
::需要守护的进程预估启动完毕所需时间,单位:秒
set _processTimeout=10
 
::需要守护的进程所监听的端口
set _port=8080
 
::进程用户名,一般是Administrator
set _username=Administrator 
 
:LOOP
set /a isAlive=false
 
::通过进程名称检测
::tasklist /FI "username eq %_username%" | find /C "%_processName%" > temp.txt
::set /p num= < temp.txt ::del /F temp.txt ::通过进程的端口是否正在被监听检测 netstat -an | find /C "0.0.0.0:%_port%" > temp.txt
set /p num= < temp.txt del /F temp.txt if "%num%" == "0" ( start %_processCmd% | echo 启动 %_processName% 于 %time% choice /D y /t %_processTimeout% > nul
)
 
if "%num%" NEQ "0" echo 已启动
 
::ping -n %_interval% 127.1>nul
choice /D y /t %_interval% >nul
 
goto LOOP

该脚本运行后会出现一个dos窗口,若觉得碍眼可以用记事本将下面保存为扩展名为.vbs的文件。其中guard.bat是上面批处理保存的文件名。两个文件放在同一目录下双击vbs文件后,守护进程就在后台运行了,单这样得通过资源管理器结束cmd进程才能停止守护进程。

set ws=WScript.CreateObject("WScript.Shell")
ws.Run "guard.bat",0

根据上面的内容自己修改一个放到项目上使用:

1)可以根据参数,执行指定的程序

2)可以保存详细的执行日志

echo off
title processWatch
cls
set d=%date:~0,10%
set d=%d: =0%
echo %d%
set logFile=.processWatch_%d:-=%.txt
echo 现在时间:%date%%time% 
echo ********程序开始启动******** >> %logFile%
 
set runAppPath=%1
set runAppPath="C:UsersAdministratorDesktop新建文件夹Cares.AutoUpdate.exe"
set runAppFolder=''
if '%runAppPath%'=='' (goto end)
 
set _processName=''
set _processNameExt=''
::检测时间间隔,单位:秒
set _interval=10
 
for %%a in (%runAppPath%) do (
set _processName=%%~na
set _processNameExt=%%~nxa
set runAppFolder=%%~dpa
)
goto checkstart
 
rem 以下是测试代码
echo %_processName%
echo %_processNameExt%
echo %runAppFolder%
echo %runAppPath%
echo ====================================================
goto end
 
 
:checkstart
set d=%date:~0,10%
set d=%d: =0%
set logFile=.processWatch_%d:-=%.txt
for /f "tokens=1" %%n in ('tasklist.exe ^| find /I "%_processNameExt%" ') do ( 
if '%%n'=='%_processNameExt%' (echo 检查进程【%_processNameExt%】正在运行 >> %logFile% && goto checkend) )
echo 检查进程【%_processNameExt%】未在运行 >> %logFile%
 
:startApp
echo, && echo ********开始启动程序********
echo ********开始启动程序******** >> %logFile%
echo [%date:~0,10%%time:~0,8%] 未检测到【%_processNameExt%】的进程,将重新启动程序 >> %logFile%
echo [%date:~0,10%%time:~0,8%] 重新启动程序:%runAppPath%
echo [%date:~0,10%%time:~0,8%] 重新启动程序:%runAppPath% >> %logFile%
echo 开始执行 start "" %runAppPath% >> %logFile%
pushd %runAppFolder%
start "" %runAppPath%
popd
echo ********启动程序完成******** && echo,
echo ********启动程序完成******** >> %logFile%
echo, >> %logFile%
 
 
:checkend
echo [%date:~0,10%%time:~0,8%] 程序【%_processNameExt%】运行正常,%_interval%秒后继续检查......
choice /t %_interval% /d y /n >nul
goto checkstart
 
:end
echo end.

线上运行的windows服务有时候可能会挂掉,又不确定挂掉的原因,目前的办法是在服务器上运行守护进程,监控服务一旦停止尽快重启,用一个bat批处理来简单实现此监控:

Windows服务守护进程bat批处理脚本

@echo off
title "Elasticsearch 主服务(windows 服务)"守护进程【若需停止服务请先临时关闭此进程】
rem 定义循环间隔时间和监测的服务:
set secs=60
set srvname="es-master"
set showname="Elasticsearch 主服务"
 
echo.
echo ========================================
echo ==     查询计算机服务的状态,        ==
echo ==     每间隔%secs%秒种进行一次查询  ==
echo ==     如发现其停止,则立即启动      ==
echo ========================================
echo.
echo 此脚本监测的服务是:%showname%
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=
echo 检测时间:%date:~0,10% %time:~0,8%
rem 下面的命令用于延时,否则可能会导致 cpu 单个核心满载。
ping -n %secs% 127.0.0.1 > nul
goto chkit
:end 

脚本不间断监控notepad.exe,若停止,则自动重启,程序如下:

@echo off
 
set _task = notepad.exe
set _svr  = c:\windows\notepad.exe
set _des  = start.bat
 
:checkService
for /f "tokens=5" %%n in ('qprocess.exe ^| find "%_task%" ') do (
    if %%n==%_task% (goto checkMessage) else goto restartService
)
  
:restartService
echo %time% 
echo ********程序开始启动********
echo 程序重新启动于 %time% ,请检查系统日志 >> restart_service.txt
echo start %_svr% > %_des%
echo exit >> %_des%
start %_des%
REM set /p=.nul
echo .
del %_des% /Q
echo ********程序启动完成********
goto checkService
 
 
:checkMessage
echo %time% 程序运行正常,5秒后继续检查.. 
ping localhost -n 5 
goto checkService

实现批处理文件每隔一段时间运行一次

需求说明:实现双击一个批处理文件,每隔一个小时启动exe文件

实现步骤:
新建一个文本文档 run.txt
复制以下代码到run.txt文件中
更改文件后缀txt为bat,双击启动

@echo off  
set INTERVAL=3600 
:Again  
echo start server
taskkill /f /t /im demo.exe
C:
cd C:\Users\Denison\Desktop\Demo
start demo.exe
timeout %INTERVAL%
goto Again

详细说明:就上述代码做详细说明

1、@echo off :关闭回显,即关闭批处理文件在DOS中一行一行命令的显示
2、set INTERVAL=3600 :设置间隔时间参数,单位秒,3600即一个小时
3、:Again ~ goto Again :":"是一个标签,"goto"是一个跳转命令,和循环的效果一样
4、echo start server:回显,即将echo后面的内容现在在DOS中
5、taskkill /f /t /im demo.exe:强制关闭名为demo.exe的进程
6、C::回到C盘的根目录
7、cd C:\Users\Denison\Desktop\Demo:进入后面的路径目录
8、start demo.exe:运行当前目录中的demo.exe文件
9、timeout %INTERVAL%:暂停命令 后面是上面设置的时间参数

付费处理问题,非诚勿扰,付出才有收获;有意加微信2589053300 --更多请关注:老梁`s Blog

所写所说,是心之所感,思之所悟,行之所得;文当无敷衍,落笔求简洁。 以所舍,求所获;有所依,方所成!

支付宝赞助
微信赞助

免责声明,若由于商用引起版权纠纷,一切责任均由使用者承担。

您必须遵守我们的协议,如您下载该资源,行为将被视为对《免责声明》全部内容的认可->联系老梁投诉资源
LaoLiang.Net部分资源来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。 敬请谅解! 侵权删帖/违法举报/投稿等事物联系邮箱:service@laoliang.net
意在交流学习,欢迎赞赏评论,如有谬误,请联系指正;转载请注明出处: » Windows使用bat脚本实现软件进程检测(服务守护进程)

发表评论

本站承接,网站推广(SEM,SEO);软件安装与调试;服务器或网络推荐及配置;APP开发与维护;网站开发修改及维护; 各财务软件安装调试及注册服务(金蝶,用友,管家婆,速达,星宇等);同时也有客户管理系统,人力资源,超市POS,医药管理等;

立即查看 了解详情