Windows使用bat脚本实现软件进程检测(服务守护进程)
[重要通告]如您遇疑难杂症,本站支持知识付费业务,扫右边二维码加博主微信,可节省您宝贵时间哦!
写这篇文章还是前段时间因为一个守护进程的事儿,一直想着如何能处理更简洁,有想用软件的,有喜欢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%:暂停命令 后面是上面设置的时间参数
问题未解决?付费解决问题加Q或微信 2589053300 (即Q号又微信号)右上方扫一扫可加博主微信
所写所说,是心之所感,思之所悟,行之所得;文当无敷衍,落笔求简洁。 以所舍,求所获;有所依,方所成!