背景介绍
有了windows任务计划之后,可以实现开机执行脚本+定时执行脚本了,那这个脚本该怎么写呢?总的套路是1拖n的策略。所谓的1就是群起脚本,通过监控每个部件提供的服务(比如监听端口),来监控是否还活着,如果活着就输出一句日志,如果宕机了则调用组件的启动脚本进行重启。在这个群起脚本中,可以开头获得管理员权限,强化一下执行时的权限。n代表的是整体产品的组件拆分,比如我司做的平台可以拆分为5个组件,对应5个启动脚本。
解决方案
群起脚本,分为几个部分:获取权限部分,配置部分,主函数部分,子函数部分。测活的手段也是检测是否监听。
@echo off
rem 设置控制台输出为utf-8
chcp 65001
title "一键群起"
rem exec执行引擎相关参数设置,注意,日志的目录需要提前创建好
set srvExecPort=22973
set srvExecLog=log_exec.txt
rem 算法中间件启动
set srvAlgorithmPort=22972
set srvAlgorithmLog=python_exec.txt
rem web后端启动配置
set srvWebJavaPort=22971
set srvWebJavaLog=web_java.txt
rem MYSQL启动配置
set srvMysqlPort=3306
set srvMysqlLog=mysql_log.txt
if exist "%SystemRoot%\SysWOW64" path %path%;%windir%\SysNative;%SystemRoot%\SysWOW64;%~dp0
bcdedit >nul
if '%errorlevel%' NEQ '0' (goto UACPrompt) else (goto UACAdmin)
:UACPrompt
%1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","::",,"runas",1)(window.close)&exit
exit /B
:UACAdmin
cd /d "%~dp0"
echo 当前运行路径是:%CD%
echo 已获取管理员权限
echo --------执行平台一键启动脚本--------
call:checkAliveAndStart
echo --------执行平台一键启动脚本执行完毕--------
goto:eof
:checkAliveAndStart
echo 检测mysql是否启动
echo 检测vue是否启动
echo 检测web后端是否启动
echo 检测算法中间件是否启动
call:checkAlgorithmMWAliveAndStart
echo 检测工作流执行引擎是否启动
goto:eof
rem python 算法中间件
:checkAlgorithmMWAliveAndStart
echo -------------------------------------------------------------------------------------------------start >> %srvAlgorithmLog%
echo [%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2%] 开始检查算法中间件的运行情况 ...... >>%srvAlgorithmLog%
set state=0
for /f "tokens=3 delims=: " %%a in ('netstat -an') do if "%%a"=="%srvAlgorithmPort%" set state=1
if %state%==1 (
echo [%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2%] 算法中间件正常运行!>> %srvAlgorithmLog%
)else if not %state%==1 (
echo [%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2%] 算法中间件未启动! >> %srvAlgorithmLog%
echo [%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2%] 尝试启动算法中间件 ...... >> %srvAlgorithmLog%
rem start是在新窗口启动 call是在本窗口流式启动
start startEdgeMind_algorithm_python.bat
rem 给10s的启动时间
choice /t 2 /d y /n >nul
for /f "tokens=3 delims=: " %%b in ('netstat -an') do (
if "%%b"=="%srvAlgorithmPort%" (
echo [%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2%] 算法中间件启动成功!>> %srvAlgorithmLog%
)
)
)
set state=
echo -------------------------------------------------------------------------------------------------end >> %srvAlgorithmLog%
goto:eof
部件的启动脚本的最终形态是带参数可以实现启动,关闭,重启。这里只用到了启动。
@echo off
chcp 65001
title "执行引擎启动终端"
java -DFile.encoding=utf-8 -jar D:\codeRepo\EdgeMindPlatform\EdgeMind-exec\target\EdgeMind-exec-0.0.1-SNAPSHOT.jar
参考资料
https://www.jb51.net/article/193692.htm 批处理文件如何获得管理员权限,针对一些需要管理员权限才能运行的程序
|