Window下使用bat批处理实现进程守护

2021-03-28  本文已影响0人  刘小白DOER

    笔者早linux中写过shell脚本来实现进程守护(参考文章-Linux进程怎么保证高可用性),思路是判断进程是否存在,如果不存在就开启进程,然后将脚本加入到crontab定时任务中来定时检查进程是否存在。

    笔者参与的项目有个可视化监控程序,这个需要7*24展示在界面上提供给运维人员来查看并记录设备状态的告警。为了防止进程down掉或被人误关闭,笔者想着能不能在Window下使用bat批处理实现进程守护?在另外的其他项目里面,为了防止监控程序被误关闭加入了关闭界面时需要输入密码认证,只有认证成功后才能关闭,但是为预防关闭后没有打开,进程守护的使用很有必要的。

      原理和shell是一样的,通过tasklist | find /C "进程名.exe" 判断进程是否存在,如果不存在则启动start  进程名.exe 。先在cmd里面来测试一下进程:

    也可以使用qprocess来代替tasklist。

    先看代码,笔者使用PUTTY.EXE来测试。

@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执行效果

    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的任务计划程序来定时调用批处理脚本。

    接下里就是任务计划里面编辑添加基本任务了,按照流程命名任务计划、触发器、操作选择批处理等等。

上一篇下一篇

猜你喜欢

热点阅读