当前位置:   article > 正文

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

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 文件下载

  1. @echo off
  2. %1 mshta vbscript:CreateObject("WScript.Shell").Run("%~s0 ::",0,FALSE)(window.close)&&exit
  3. set EMQX_PATH=E:\emqx
  4. set OUTPUT_FILE=%EMQX_PATH%\emqx_monitor.log
  5. :loop
  6. cd /d "%EMQX_PATH%"
  7. REM 获取当前日期时间,并格式化为时间戳
  8. for /f "tokens=1-4 delims=/ " %%a in ('date /t') do (
  9. set year=%%a
  10. set month=%%b
  11. set day=%%c
  12. )
  13. for /f "tokens=1-3 delims=: " %%a in ('time /t') do (
  14. set hour=0%%a
  15. set minute=%%b
  16. )
  17. set timestamp=%year%-%month%-%day% %hour:~-2%:%minute%
  18. cd bin
  19. emqx_ctl status | findstr /C:"Node 'emqx@127.0.0.1'" | findstr /C:"is started" >NUL
  20. IF "%ERRORLEVEL%"=="0" (
  21. echo [%timestamp%] EMQX is running normally. >> %OUTPUT_FILE%
  22. ) ELSE (
  23. echo [%timestamp%] EMQX is not running. Restarting... >> %OUTPUT_FILE%
  24. REM 结束之前的 EMQX 进程,可以通过 taskkill 命令来实现
  25. REM taskkill /f /im beam.smp.exe >NUL
  26. start /b cmd /c "%EMQX_PATH%\bin\emqx start"
  27. echo [%timestamp%] EMQX has started. >> %OUTPUT_FILE%
  28. )
  29. timeout /t 60 > NUL
  30. 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 文件下载

  1. @echo off
  2. title emqx_monitor
  3. set EMQX_PATH=E:\emqx
  4. :loop
  5. cd /d "%EMQX_PATH%"
  6. REM 获取当前日期时间,并格式化为时间戳
  7. for /f "tokens=1-4 delims=/ " %%a in ('date /t') do (
  8. set year=%%a
  9. set month=%%b
  10. set day=%%c
  11. )
  12. for /f "tokens=1-3 delims=: " %%a in ('time /t') do (
  13. set hour=0%%a
  14. set minute=%%b
  15. )
  16. set timestamp=%year%-%month%-%day% %hour:~-2%:%minute%
  17. cd bin
  18. emqx_ctl status | findstr /C:"Node 'emqx@127.0.0.1'" | findstr /C:"is started" >NUL
  19. IF "%ERRORLEVEL%"=="0" (
  20. echo [%timestamp%] EMQX is running normally.
  21. ) ELSE (
  22. echo [%timestamp%] EMQX is not running. Restarting...
  23. REM 结束之前的 EMQX 进程,可以通过 taskkill 命令来实现
  24. REM taskkill /f /im beam.smp.exe >NUL
  25. start /b cmd /c "%EMQX_PATH%\bin\emqx start"
  26. echo [%timestamp%] EMQX has started.
  27. REM 如果 EMQX 不直接启动一个新窗口,可以将上面一行修改为以下内容
  28. REM call %EMQX_PATH%\emqx start
  29. )
  30. timeout /t 60 > NUL
  31. goto loop

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/188668
推荐阅读
相关标签
  

闽ICP备14008679号