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

news2025/4/12 5:11:20

0.前言

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

1.介绍

        此脚本每隔60秒监测一次EMQX的运行状态,若未正常运行则重新启动该程序,我们可以给该脚本命名为 emqx_monitor.bat,并加入windows系统启动项,以实现开启自启。

        注意:使用前需要 将 EMQX_PATH 变量的值配置为你自己的 emqx 目录。

        文件下载

@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.详解

由于本人过于懒惰,以下内容为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 服务的状态,并根据服务的运行状态记录相关信息到日志文件中。如果服务未运行,它将尝试重新启动服务。然后,它会等待一段时间后再次进行状态检查,以持续监视服务的运行情况。

3.运行结果

15:26时我手动停止EMQX 模拟崩溃场景,脚本成功将EMQX启动。

通过网页验证访问成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/717560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GS DynamicMeshActor

GS DynamicMeshActor GeometryScript DynamicMeshActor。 ADynamicMeshActor与AStaticMeshActor类似之处在于,它主要是UDynamicMeshComponent的容器。但是,DynamicMeshActor确实为想要基于UDynamicMesh实现程序化网格体生成的Actor蓝图提供了一些特定支…

【C语言】图文解析,深入浅出汉诺塔问题

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,这里是君兮_,今天更新一篇我一直想更但是一直没空写的博客——汉诺塔问题,在所有有关递归的问题中,汉诺塔问题是最经典的问题之一,可以说,如果你能真正理…

GitGithub 上手就是这么简单!

Git 和 Github 对程序员或计算机爱好者来说肯定都不陌生,这个不多说!下面要做的就是带你光速掌握 git 和 github 的日常操作,让你做到心中有数。 我们为什么要学习Git&Github?嗯… 相信你是带着目的学习的! 不过…

Nginx三大核心功能

一、反向代理🍉 (1)什么是正向代理🥝 概念 正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器&#xf…

Lion:闭源大语言模型的对抗蒸馏

Lion:闭源大语言模型的对抗蒸馏 Lion,由香港科技大学提出的针对闭源大语言模型的对抗蒸馏框架,成功将 ChatGPT 的知识转移到了参数量 7B的 LLaMA 模型(命名为 Lion),在只有 70k训练数据的情况下&#xff0…

白嫖一份小白到进阶网络安全学习宝典【建议收藏】

前言 想学网络安全但是无从下手的小白看过来,非常系统的学习资料,无数小白看了这份资料都已经成功入门,涵盖多个网络安全知识点,我愿称之为网络安全自学宝典。 一、概念性知识 1、了解什么是网络安全 2、清楚法律法规 3、网络安…

【ElatsticSearch】ES索引库与文档的增删改查

文章目录 一、操作索引库1、mapping映射属性2、索引库的CRUD 二、文档操作1、新增文档2、查询文档3、删除文档4、修改文档5、注意点 一、操作索引库 1、mapping映射属性 mapping是对索引库中文档的约束,常见的mapping属性包括: type:字段数…

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(7 月 4 日论文合集)

文章目录 一、分割|语义相关(18篇)1.1 TomatoDIFF: On-plant Tomato Segmentation with Denoising Diffusion Models1.2 CGAM: Click-Guided Attention Module for Interactive Pathology Image Segmentation via Backpropagating Refinement1.3 RefSAM: Efficiently Adapting …

Python实现通过GUI界面提交参数,来启动python脚本

前言 本文是该专栏的第30篇,后面会持续分享python的各种干货知识,值得关注。 假设现在有如下需求,用python写一个GUI界面,在该GUI界面上输入参数信息,然后再点击GUI界面上的提交按钮,启动并执行对应的python脚本。换言之,在GUI界面上输入的参数信息传递给对应的python脚…

图像处理常用算法(基础)

同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像。需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界。有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,…

【动态规划算法练习】day14

文章目录 一、97. 交错字符串1.题目简介2.解题思路3.代码4.运行结果 二、712. 两个字符串的最小ASCII删除和1.题目简介2.解题思路3.代码4.运行结果 三、718. 最长重复子数组1.题目简介2.解题思路3.代码4.运行结果 总结 一、97. 交错字符串 1.题目简介 97. 交错字符串 给定三个…

嵌入式如何面试10家公司,拿到9个offer的?

又快到一年一度的秋招季,不少同学私信学长吐苦水,明明在各大招聘网站上海投了那么多家公司,收到的面试通知却屈指可数,好不容易拿到面试机会,却在一面就扑街...... 很多同学能力还行,但是经验谈不上很出彩&…

【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)

发现问题的契机: 学习异步通知的时候,自己实现一个功能:按键控制蜂鸣器,同时LED灯在闪烁 结果:LED好像也同时被按键控制了 最后调试结果发现: 应用层的sleep被驱动层的kill_fasync打断,所以sle…

GB/T 3596-2008 购买线材时,判断线材标称直径和载流的方法

文章目录 GB/T 3596-2008 购买线材时,判断线材标称直径和载流的方法概述笔记老国标 - 判断线材标称直径的方法END GB/T 3596-2008 购买线材时,判断线材标称直径和载流的方法 概述 在淘宝上买线材, 买了RV1.5/RV1.0各买了4种颜色(红/黑/黄绿/蓝). 看到评论区, 有人留言, 说线径…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 3 日论文合集)

文章目录 一、检测相关(9篇)1.1 Federated Ensemble YOLOv5 - A Better Generalized Object Detection Algorithm1.2 Zero-shot Nuclei Detection via Visual-Language Pre-trained Models1.3 Federated Object Detection for Quality Inspection in Shared Production1.4 Comp…

Raw Socket 之网络层数据获取

目录 简介正常使用tcpdump程序与分析报文理解参考 简介 针对网络包,我们一般的发送接收直接使用的是应用层,此时无法分辨接收为广播包还是单播包,为了能够分辨出接收到的是否为广播包,需要接收数据链路层的数据或者网络层的数据。…

ct.js笔记-加载字体时字体名不能包含中文

这个和Qt很像,在开发过程中尽量避免使用中文。如下: 这个AaJH中文,在加载时: this.nickNameLabel new PIXI.Text(Your text here, ct.styles.get(AaJH中文)); this.addChild(this.nickNameLabel);this.nickNameLabel.x 30; thi…

UE5接入在线直播视频源,如hls(m3u8)格式

文章目录 1.实现目标2.实现过程2.1 VlcMedia插件重编译2.2 UE5接入在线直播2.3 创建材质3.参考资料1.实现目标 通过重编译VlcMedia插件,以支持在线直播视频在UE5中的播放,GIF动图如下: 2.实现过程 本文主要包括插件的重编译、在线直播视频的接入,以及材质的创建三个部分。…

基于Java办公用品管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

atomic原子操作

当一个程序中的两个线程同时向这个程序里的全局变量增加数时会发生什么? 理论上来说,应该是200000,但是最后结果不是200000。 这是多个线程同时操作一个全局变量引起的错误。 要解决这个错误,用互斥锁即可: 这样就可以…