windows下bat批处理实现守护进程(有⽇志)
开发部的⼀个核⼼程序总是会⾃⼰宕机,然后需要⼿⼯去起,⽽这个服务的安全级别⼜很⾼,只有我可以操作,搞得我晚上⽼没法睡,昨晚实在受不了了,想起以前在hp-ux下写的shell 守护进程,这回搞个windows下的bat版守护程序吧,当时晚上思路已经很迟钝了,就叫了个兄弟让他写了,上去后运⾏效果不错,⾄少昨晚我安⼼睡了7⼩时。
早上来把程序改完善⼀些,增加了记录等功能。
实现:
检查是否有notepad,要⽤的话就算成⾃⼰的进程名,如果进程宕了就过会⾃动重启(会在当前⽬录下⽣成⼀个start.bat)
@echo off
set _
set _svr=c:/
set _des=start.bat
:checkstart
for/f "tokens=5"%%n in(' ^| find "%_task%"')do(
if%%n==%_task%(goto checkag)else goto startsvr
)
:startsvr
echo %time%
echo ********程序开始启动********
echo 程序重新启动于%time%,请检查系统⽇志>>
echo start %_svr%>%_des%
echo exit>>%_des%
start %_des%
set/p=.<nul
for/L %%i in(1 1 10)do set/p a=.<nul& /n 2 127.0.0.1>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程序不适⽤,另⼀种是通过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%" >
::set /p num= <
::del /
::通过进程的端⼝是否正在被监听检测
netstat -an | find /C "0.0.0.0:%_port%" >
set /p num= <
del /
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:\Users\Administrator\Desktop\新建⽂件夹\"
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 (' ^| 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.
View Code
后续将继续优化
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论