EMQX在Windows系统下的开机自启与异常自动重启脚本

目录

0.前言

1.介绍

2.运行与停止

2.1 运行批处理程序

2.2 停止批处理程序

2.3 开机自启动

3.运行结果

4.详细介绍

5.前台运行版本


0.前言

        由于为某万年老项目做运维,但源码遗失以及项目遗留问题导致emqx经常崩溃,故无法追根溯源,迫于无奈才不得已出此下策,以定时监测并自动重启EMQX为临时解决方案,若能一劳永逸当然再好不过,各位友友们自求多福。

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)&&exit

set 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=%%a
    set month=%%b
    set day=%%c
)
for /f "tokens=1-3 delims=: " %%a in ('time /t') do (
    set hour=0%%a
    set 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 >NUL

    start /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_monitor

set EMQX_PATH=E:\emqx

:loop
cd /d "%EMQX_PATH%"

REM 获取当前日期时间,并格式化为时间戳
for /f "tokens=1-4 delims=/ " %%a in ('date /t') do (
    set year=%%a
    set month=%%b
    set day=%%c
)
for /f "tokens=1-3 delims=: " %%a in ('time /t') do (
    set hour=0%%a
    set 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 >NUL

    start /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

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值