Windows上程序部署为服务方式运行,但是有时服务会因各种原因挂掉,需要手动启动该服务,很麻烦;
可以通过批处理文件解决该问题;定时检查服务是否正常,如果服务停止了,自动把该服务启动起来。这里使用“管理工具”->“任务计划程序”的解决方案:
批处理文件写法(譬如startproc.bat):
1、检查服务(jssvcl)是否停止,停止则自动重启该服务(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):