EMQX Windows服务化实战:从开机自启到异常监控的全套批处理教程
EMQX Windows服务化实战:从开机自启到异常监控的全套批处理教程
在企业级物联网应用中,EMQX作为高性能MQTT消息服务器,其稳定性直接影响业务连续性。本文将手把手教你如何将EMQX转化为Windows系统服务,实现开机自启、异常监控和自动恢复的全套解决方案。
1. 环境准备与基础配置
1.1 EMQX安装与路径设置
首先确保EMQX已正确安装在Windows系统上。建议使用官方推荐的5.x版本,其Windows兼容性已大幅优化。安装完成后,记录EMQX的安装路径(如C:\emqx),这将是后续所有脚本配置的基础。
验证安装是否成功:
cd C:\emqx\bin emqx start emqx_ctl status1.2 批处理脚本基础框架
创建一个名为emqx_watchdog.bat的文件,这是我们的核心监控脚本。基础框架应包含:
- 环境变量设置
- 日志记录功能
- 状态检测循环
- 异常处理机制
@echo off setlocal enabledelayedexpansion :: 配置区域 set EMQX_PATH=C:\emqx set LOG_FILE=%EMQX_PATH%\logs\emqx_watchdog.log set CHECK_INTERVAL=602. 服务化核心实现
2.1 后台静默运行技术
通过Windows脚本宿主实现后台运行:
if "%1"=="hide" goto main start /min cmd /c "%~0" hide & exit :main :: 实际监控代码将放在这里2.2 状态检测与自动重启
核心监控逻辑采用循环检测机制,每60秒检查一次EMQX状态:
:monitor_loop cd /d "%EMQX_PATH%\bin" :: 获取精确时间戳 for /f "tokens=1-6 delims=:/. " %%a in ('echo %date% %time%') do ( set timestamp=%%c-%%a-%%b %%d:%%e:%%f ) :: 状态检测 emqx_ctl status >nul 2>&1 if !errorlevel! equ 0 ( echo [!timestamp!] EMQX运行正常 >> "%LOG_FILE%" ) else ( echo [!timestamp!] 检测到EMQX异常,正在重启... >> "%LOG_FILE%" taskkill /f /im beam.smp.exe >nul 2>&1 call emqx start timeout /t 10 >nul emqx_ctl status >nul 2>&1 if !errorlevel! equ 0 ( echo [!timestamp!] EMQX重启成功 >> "%LOG_FILE%" ) else ( echo [!timestamp!] 重启失败,请检查系统 >> "%LOG_FILE%" ) ) :: 间隔等待 timeout /t %CHECK_INTERVAL% >nul goto monitor_loop2.3 日志轮转机制
为防止日志文件过大,添加日志轮转功能:
:: 在脚本开头添加 set MAX_LOG_SIZE=1048576 :: 1MB :: 在循环开始前检查日志大小 for %%F in ("%LOG_FILE%") do set logsize=%%~zF if %logsize% gtr %MAX_LOG_SIZE% ( move "%LOG_FILE%" "%LOG_FILE%.bak" >nul echo 日志已轮转,创建新日志文件 >> "%LOG_FILE%" )3. 系统集成方案
3.1 注册为Windows服务
使用NSSM工具将监控脚本注册为系统服务:
- 下载NSSM:https://nssm.cc/download
- 安装服务:
nssm install EMQXMonitor "%CD%\emqx_watchdog.bat" nssm set EMQXMonitor DisplayName "EMQX Monitor Service" nssm set EMQXMonitor Start SERVICE_AUTO_START nssm start EMQXMonitor3.2 开机自启配置
通过任务计划程序实现更可靠的自启动:
- 创建基本任务
- 触发器设置为"计算机启动时"
- 操作为"启动程序",选择我们的批处理文件
- 勾选"不管用户是否登录都要运行"
3.3 服务管理命令
常用管理命令汇总:
| 操作 | 命令 | 说明 |
|---|---|---|
| 启动服务 | net start EMQXMonitor | 手动启动监控服务 |
| 停止服务 | net stop EMQXMonitor | 停止监控服务 |
| 查看状态 | sc query EMQXMonitor | 查询服务运行状态 |
| 删除服务 | sc delete EMQXMonitor | 彻底移除服务 |
4. 高级监控与故障排查
4.1 多维度健康检查
增强版状态检测脚本:
:: 检查端口监听 netstat -ano | findstr ":1883" >nul set port_status=!errorlevel! :: 检查进程内存占用 wmic process where "name='beam.smp.exe'" get workingsetsize >nul set mem_status=!errorlevel! :: 综合判断 if !port_status! neq 0 if !mem_status! neq 0 ( echo [!timestamp!] 严重:EMQX进程和端口均异常 >> "%LOG_FILE%" call :emergency_restart )4.2 邮件报警集成
通过PowerShell发送报警邮件:
:send_alert set alert_msg=EMQX服务异常,已尝试自动恢复。请检查服务器状态。 powershell -command "Send-MailMessage -From 'alert@example.com' -To 'admin@example.com' -Subject 'EMQX异常报警' -Body '%alert_msg%' -SmtpServer 'smtp.example.com' -Port 587 -Credential (New-Object System.Management.Automation.PSCredential('user', (ConvertTo-SecureString 'password' -AsPlainText -Force))) -UseSsl" goto :eof4.3 常见问题解决方案
问题1:端口占用导致启动失败
:: 在重启前添加端口释放 netstat -ano | findstr ":1883" | findstr "LISTENING" >nul if !errorlevel! equ 0 ( for /f "tokens=5" %%p in ('netstat -ano ^| findstr ":1883" ^| findstr "LISTENING"') do ( taskkill /f /pid %%p ) )问题2:资源泄漏处理
:: 定期完全重启 set /a restart_counter+=1 if !restart_counter! geq 100 ( echo [!timestamp!] 执行预防性完全重启 >> "%LOG_FILE%" call emqx stop timeout /t 30 >nul call emqx start set restart_counter=0 )5. 性能优化与最佳实践
5.1 资源占用控制
通过启动参数限制EMQX资源使用:
:: 修改emqx启动脚本 set EMQX_NODE_NAME=emqx@127.0.0.1 set EMQX_CLUSTER__DISCOVERY=static set EMQX_LISTENERS__TCP__DEFAULT__ACCEPTORS=16 set EMQX_LISTENERS__SSL__DEFAULT__ACCEPTORS=45.2 监控脚本优化
减少资源消耗的技巧:
- 调整检测间隔:业务高峰期缩短间隔,闲时延长间隔
- 轻量级检测:先用端口检测,失败后再进行完整状态检查
- 日志分级:正常状态减少日志输出,异常时详细记录
5.3 高可用方案
对于关键业务系统,建议:
- 部署多个EMQX节点组成集群
- 使用负载均衡器分发MQTT连接
- 实现跨服务器的心跳检测
- 配置数据库持久化确保消息不丢失
:: 集群状态检查增强版 emqx_ctl cluster status | findstr "running" >nul if !errorlevel! neq 0 ( echo [!timestamp!] 集群状态异常 >> "%LOG_FILE%" call :handle_cluster_failure )