Discord.js机器人(PM2部署于Ubuntu VPS)随机离线问题求助
问题排查与永久修复方案
原因排查方向
- 细化Discord.js连接日志:默认日志仅记录断开事件,开启
debug事件可捕获心跳、重连尝试、网关交互的细节,判断是重连失败还是无重连触发。在机器人代码中添加:
运行过夜后查看日志,重点关注断开前后的心跳响应、重连请求状态。client.on('debug', console.log); - 检查VPS网络稳定性:夜间机房可能存在网络维护或节点波动,用
mtr持续监控Discord网关:
次日查看日志中的丢包率、延迟波动;同时检查系统日志nohup mtr discord.com > /var/log/discord_mtr.log 2>&1 &/var/log/syslog,确认是否有网卡重启、IP变更等网络异常。 - 验证pm2监控逻辑:pm2默认仅监控进程是否存活,机器人进程未崩溃但断开连接时不会触发重启。查看pm2自身日志:
排查是否有进程资源限制触发的隐性问题,同时用pm2 logs pm2pm2 monit实时观察内存/CPU占用,确认夜间是否有资源突增导致心跳超时。 - 排查资源瓶颈:开启pm2资源使用日志:
日志中会记录进程的内存、CPU变化,判断是否因内存泄漏或CPU过载导致Discord心跳发送失败。pm2 set pm2:log_resource_usage true
永久修复方案
- 优化Discord.js重连机制:调整客户端配置增强重连能力,同时监听断开事件触发兜底逻辑:
const client = new Discord.Client({ intents: [/* 你的intents配置 */], retryLimit: 15, // 提高重连尝试次数 restTimeOffset: 150 // 调整REST请求时间偏移,避免超时 }); client.on('disconnect', () => { console.log('与Discord网关断开,等待重连...'); // 30秒后仍未恢复则退出进程,触发pm2重启 setTimeout(() => { if (!client.isReady()) process.exit(1); }, 30000); }); - 配置pm2主动重启规则:
- 基于内存阈值重启:防止内存泄漏导致的异常,比如设置内存超过500M时重启:
pm2 restart <你的机器人进程名> --max-memory-restart 500M - 自定义健康检查脚本:编写简单的在线检测脚本
check_bot.js:
用pm2定时执行脚本,检测失败则重启:const { Client } = require('discord.js'); const client = new Discord.Client({ intents: [] }); client.login('你的机器人TOKEN') .then(() => { process.exit(0); }) .catch(() => { process.exit(1); });pm2 start check_bot.js --name bot-health-check --cron "*/20 * * * *" --no-autorestart
- 基于内存阈值重启:防止内存泄漏导致的异常,比如设置内存超过500M时重启:
- 依赖版本升级:升级pm2和Discord.js到最新稳定版,修复已知的重连、进程监控bug:
npm install -g pm2@latest npm install discord.js@latest - 网络配置优化:修改VPS DNS为Cloudflare 1.1.1.1或Google 8.8.8.8,减少DNS解析延迟;检查安全组/防火墙规则,确保Discord网关端口(443、80)无限制。
内容的提问来源于stack exchange,提问作者SirArchibald
相关产品推荐
相关产品推荐

