Window下使用bat批处理实现进程守护
笔者早linux中写过shell脚本来实现进程守护(参考文章-Linux进程怎么保证高可用性),思路是判断进程是否存在,如果不存在就开启进程,然后将脚本加入到crontab定时任务中来定时检查进程是否存在。
笔者参与的项目有个可视化监控程序,这个需要7*24展示在界面上提供给运维人员来查看并记录设备状态的告警。为了防止进程down掉或被人误关闭,笔者想着能不能在Window下使用bat批处理实现进程守护?在另外的其他项目里面,为了防止监控程序被误关闭加入了关闭界面时需要输入密码认证,只有认证成功后才能关闭,但是为预防关闭后没有打开,进程守护的使用很有必要的。
原理和shell是一样的,通过tasklist | find /C "进程名.exe" 判断进程是否存在,如果不存在则启动start 进程名.exe 。先在cmd里面来测试一下进程:
也可以使用qprocess来代替tasklist。
先看代码,笔者使用PUTTY.EXE来测试。
bat执行效果@echo off
title task进程监控
rem 定义需要监控程序的进程名和程序路径
set taskName=PUTTY.EXE
set taskPath=D:\putty\
cls
echo.
echo task进程守护开始……
echo.
rem 定义循环体
:task_protect
rem 进程列表中查找指定进程
qprocess|findstr /i %taskName% >nul
rem 变量errorlevel的值等于0表示查找到进程,否则没有查找到进程
if %errorlevel%==0 (
echo ^>%date:~0,10% %time:~0,8% 程序正在运行……
)else (
echo ^>%date:~0,10% %time:~0,8% 没有发现程序进程
echo ^>%date:~0,10% %time:~0,8% 正在重新启动程序
start %taskPath%%taskName% 2>nul && echo ^>%date:~0,10% %time:~0,8% 启动程序成功
)
rem 用ping命令来实现延时运行
::for /l %%i in (1,1,10) do ping -n 1 -w 1000 198.20.0.1>nul
ping -n 10 127.0.0.1>nul
goto task_protect
echo on
bat脚本里面有几个地方需要关注:
1、errorlevel的值表示上个命令的返回值(shell中是$?),等于0表示执行成功,查找到进程。
2、逻辑运算符“&&”表示只有在符号 && 前面的命令成功时,才用于运行该符号后面的命令。这样可以判断启动程序是成功的。
3、 bat没有shell一样的延时函数sleep,ping 命令 -n参数表示发送1个icmp包,-w 1000 表示等待回复的超时时间为1秒。或者直接使用 ping -n 10 127.0.0.1>nul ,通过控制ping的次数来延时,但是精度不高,10次大概时9秒左右。
同时需要注意的是,如果你的程序是中文名,名称太长的话,那么搜索进程需要根据任务管理器里面的名称来搜索。可以考虑再定义一个变量searchName来定义qprocess的搜索名称。
这个批处理打开后会有dos界面的。网络上又两种方法来隐藏窗口,一是在bat文件头部添加,一种是利用vbs脚本完成在,再次就不再赘述了。但是为了方便,笔者修改上面的批处理脚本,删除循环,保留查找进程与开启进程,然后利用windows的任务计划程序来定时调用批处理脚本。
接下里就是任务计划里面编辑添加基本任务了,按照流程命名任务计划、触发器、操作选择批处理等等。