Chr☆s Kwok 的技术笔记

.NET, C#, WPF, WCF, WF, .NetCore & LINQ ... I know how it works because I know why it works ...

博客园 首页 新随笔 订阅 管理
Windows上程序部署为服务方式运行,但是有时服务会因各种原因挂掉,需要手动启动该服务,很麻烦;
可以通过批处理文件解决该问题;定时检查服务是否正常,如果服务停止了,自动把该服务启动起来。这里使用“管理工具”->“任务计划程序”的解决方案:
批处理文件写法(譬如startproc.bat):
1、检查服务(jssvcl)是否停止,停止则自动重启该服务(startproc.bat的内容):
@echo off 
rem 定义监测的服务: 
set srvname="JetSun Local System Service" 
echo. 
echo ======================================== 
echo == 查询计算机服务的状态, == 
echo == 如发现其停止,则立即启动。 == 
echo ======================================== 
echo. 
echo 此脚本监测的服务是:%srvname% 
echo. 

if %srvname% == . goto end 

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% 

:end

2、检查进程是否存在,不存在则自动运行程序(startproc.bat的内容):

@echo off
REM if "%1"=="hide" goto CmdBegin
REM start mshta vbscript:createobject("wscript.shell").run("""%~0"" hide",0)(window.close)&&exit
REM :CmdBegin

tasklist | find /i "trayicondemo.exe" 
if "%errorlevel%"=="1" (goto f) else (goto e)

:f
echo [ %time:~,-3% ] Process "trayicondemo.exe" is not found !
start "" "F:\GitHub\PycharmProjects\PyQtTest\dist\trayicondemo.exe"
exit

:e
echo [ %time:~,-3% ] Process "trayicondemo.exe" has existed .
REM taskkill /f /im cmd.exe
REM pause

为了不显示CMD黑色窗口,我们可以写个vbscript脚本(譬如startproc.vbs):

Set shell = Wscript.createobject("wscript.shell")

a = shell.run ("F:\GitHub\PycharmProjects\PyQtTest\dist\startproc.bat",0)

然后在“管理工具”->“任务计划程序”,新增一个“间隔5分钟运行”的任务计划来运行上面的脚本文件(startproc.vbs)
当然,实际上也可以勉强上面繁琐的批处理命令判断进程是否存在,任务计划程序管理中有一选项“请勿启用新实例”(见图3):



posted on 2022-08-24 11:11  Chr☆s  阅读(2543)  评论(0编辑  收藏  举报