目录
0.前言
1.介绍
2.运行与停止
2.1 运行批处理程序
2.2 停止批处理程序
2.3 开机自启动
3.运行结果
4.详细介绍
5.前台运行版本
0.前言
由于为某万年老项目做运维,但源码遗失以及项目遗留问题导致emqx经常崩溃,故无法追根溯源,迫于无奈才不得已出此下策,以定时监测并自动重启EXMQ为临时解决方案,若能一劳永逸当然再好不过,各位友友们自求多福。
1.介绍
此脚本每隔60秒监测一次EMQX的运行状态,若未正常运行则重新启动该程序,我们可以给该脚本命名为 emqx_monitor.bat
注意:使用前需要 将 EMQX_PATH 变量的值配置为你自己的 emqx 目录。
emqx_monitor.bat 文件下载
@echo off
%1 mshta vbscript:CreateObject("WScript.Shell").Run("%~s0 ::",0,FALSE)(window.close)&&exitset EMQX_PATH=E:\emqx
set OUTPUT_FILE=%EMQX_PATH%\emqx_monitor.log:loop
cd /d "%EMQX_PATH%"REM 获取当前日期时间,并格式化为时间戳
for /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set year=%%aset month=%%bset day=%%c
)
for /f "tokens=1-3 delims=: " %%a in ('time /t') do (set hour=0%%aset minute=%%b
)
set timestamp=%year%-%month%-%day% %hour:~-2%:%minute%cd bin
emqx_ctl status | findstr /C:"Node 'emqx@127.0.0.1'" | findstr /C:"is started" >NUL
IF "%ERRORLEVEL%"=="0" (echo [%timestamp%] EMQX is running normally. >> %OUTPUT_FILE%
) ELSE (echo [%timestamp%] EMQX is not running. Restarting... >> %OUTPUT_FILE%REM 结束之前的 EMQX 进程,可以通过 taskkill 命令来实现REM taskkill /f /im beam.smp.exe >NULstart /b cmd /c "%EMQX_PATH%\bin\emqx start"echo [%timestamp%] EMQX has started. >> %OUTPUT_FILE%)timeout /t 60 > NUL
goto loop
2.运行与停止
2.1 运行批处理程序
双击该bat文件即可运行该批处理程序
运行后命令行黑窗口会一闪而过,同时emqx_monitor.log日志文件更新时间会一直刷新
2.2 停止批处理程序
在任务管理其详细信息中可以找到cmd.exe 和 和conhost.exe 两个程序。
点击结束程序即可。
注意:两个程序必须都停止,且要先结束cmd.exe 再结束conhost.exe 否则会一直报错
2.3 开机自启动
加入windows系统启动项,以实现开机自启。
3.运行结果
日志文件是位于emqx 文件目录下的 emqx_monitor.log。
15:26时我手动停止EMQX 模拟崩溃场景,脚本成功将EMQX启动。
通过网页验证访问成功
4.详细介绍
由于本人过于懒惰,以下内容为ChatGPT生成,大致看了一下解释应该没什么大问题,若有问题请在下方评论区指出吧
这段代码是一个批处理文件,它执行一些操作来监视和管理 EMQX 服务。让我们逐行解释这些代码的作用:
1. `@echo off`: 这行代码告诉批处理脚本在执行时不要显示命令的输出。这样可以使脚本更加清晰,只输出自定义的信息。
2. `%1 mshta vbscript:CreateObject("WScript.Shell").Run("%~s0 ::",0,FALSE)(window.close)&&exit`: 这行代码使用 VBScript 创建一个新的窗口来运行批处理文件,并立即关闭该窗口。这样可以使批处理文件在后台运行,而不会显示命令提示符窗口。
3. `set EMQX_PATH=E:\emqx`: 这行代码设置一个变量 `EMQX_PATH`,用于指定 EMQX 服务的路径。
4. `set OUTPUT_FILE=%EMQX_PATH%\emqx_monitor.log`: 这行代码设置一个变量 `OUTPUT_FILE`,用于指定输出日志文件的路径和名称。
5. `:loop` 和 `goto loop`: 这部分代码创建了一个无限循环,使批处理文件可以持续监视 EMQX 服务的状态。
6. `cd /d "%EMQX_PATH%"`: 这行代码将当前工作目录更改为 EMQX 服务的路径。
7. `for /f "tokens=1-4 delims=/ " %%a in ('date /t') do (...)`: 这行代码获取当前日期,并将其分解为年、月和日,然后将它们保存到对应的变量中。
8. `for /f "tokens=1-3 delims=: " %%a in ('time /t') do (...)`: 这行代码获取当前时间,并将其分解为小时和分钟,然后将它们保存到对应的变量中。
9. `set timestamp=%year%-%month%-%day% %hour:~-2%:%minute%`: 这行代码将日期和时间变量组合成一个时间戳(格式为 "YYYY-MM-DD HH:MM"),并将其保存到 `timestamp` 变量中。
10. `cd bin`: 这行代码将当前工作目录更改为 EMQX 服务的 "bin" 目录,以便执行后续的命令。
11. `emqx_ctl status | findstr /C:"Node 'emqx@127.0.0.1'" | findstr /C:"is started" >NUL`: 这行代码通过 `emqx_ctl status` 命令检查 EMQX 服务是否正在运行。如果服务正在运行,则输出的结果会包含 "Node 'emqx@127.0.0.1'" 和 "is started" 字符串。
12. `IF "%ERRORLEVEL%"=="0" (...) ELSE (...)`: 这行代码根据上一步的命令执行结果,判断 EMQX 服务的运行状态。如果结果为 0(即服务正在运行),则执行第一个括号中的代码块;否则,执行第二个括号中的代码块。
13. `echo [%timestamp%] EMQX is running normally. >> %OUTPUT_FILE%`: 如果 EMQX 服务正在运行,这行代码会将带有时间戳的信息写入日志文件中,表示服务正常运行。
14. `echo [%timestamp%] EMQX is not running. Restarting... >> %OUTPUT_FILE%`: 如果 EMQX 服务没有运行,这行代码会将带有时间戳的信息写入日志文件中,表示服务未运行,并准备重新启动服务。
15. `start /b cmd /c "%EMQX_PATH%\bin\emqx start"`: 这行代码通过 `start` 命令在后台启动 EMQX 服务。`/b` 参数表示以后台方式运行命令窗口,`/c` 参数表示运行命令并关闭窗口。`"%EMQX_PATH%\bin\emqx start"` 是要执行的命令。
16. `echo [%timestamp%] EMQX has started. >> %OUTPUT_FILE%`: 当 EMQX 服务重新启动后,这行代码会将带有时间戳的信息写入日志文件中,表示服务已经重新启动。
17. `timeout /t 60 > NUL`: 这行代码暂停脚本的执行,等待 60 秒钟。`/t 60` 参数表示等待 60 秒,`> NUL` 表示将输出重定向到空设备,即不显示任何输出。
18. `goto loop`: 这行代码将脚本的执行跳转回 `:loop` 标签处,从而形成一个无限循环,持续监视和管理 EMQX 服务。
总体而言,这个批处理文件会不断检查 EMQX 服务的状态,并根据服务的运行状态记录相关信息到日志文件中。如果服务未运行,它将尝试重新启动服务。然后,它会等待一段时间后再次进行状态检查,以持续监视服务的运行情况。
5.前台运行版本
注意:前台运行版本不输出日志到文件,全部输出到控制台
关闭该黑窗口则程序不再运行
emqx_monitor_keep.bat 文件下载
@echo off
title emqx_monitorset EMQX_PATH=E:\emqx:loop
cd /d "%EMQX_PATH%"REM 获取当前日期时间,并格式化为时间戳
for /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set year=%%aset month=%%bset day=%%c
)
for /f "tokens=1-3 delims=: " %%a in ('time /t') do (set hour=0%%aset minute=%%b
)
set timestamp=%year%-%month%-%day% %hour:~-2%:%minute%cd bin
emqx_ctl status | findstr /C:"Node 'emqx@127.0.0.1'" | findstr /C:"is started" >NUL
IF "%ERRORLEVEL%"=="0" (echo [%timestamp%] EMQX is running normally.
) ELSE (echo [%timestamp%] EMQX is not running. Restarting... REM 结束之前的 EMQX 进程,可以通过 taskkill 命令来实现REM taskkill /f /im beam.smp.exe >NULstart /b cmd /c "%EMQX_PATH%\bin\emqx start"echo [%timestamp%] EMQX has started. REM 如果 EMQX 不直接启动一个新窗口,可以将上面一行修改为以下内容REM call %EMQX_PATH%\emqx start
)timeout /t 60 > NUL
goto loop