You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派4上Discord.js Bot经PM2设自启后重启无法重连求助

解决树莓派4上pm2开机自启Discord.js Bot时DNS解析失败的问题

我碰到过好几个用户遇到和你一模一样的问题——树莓派重启后pm2显示进程跑起来了,但Discord Bot就是离线,日志里全是getaddrinfo EAI_AGAIN discordapp.com discordapp.com:443的DNS错误,手动重启进程又立马恢复在线。

这问题的核心原因很简单:树莓派重启后,pm2启动Bot进程的时间早于网络服务完全就绪的时间,导致Bot启动时DNS解析服务还没正常工作,没法解析discord的域名。等你手动重启时,网络早就初始化完成了,自然能正常连接。

下面是几个针对性的解决办法,按推荐程度排序:

方法1:给pm2进程添加启动延迟

让pm2在开机后延迟一段时间再启动Bot,给网络足够的初始化时间。

  • 如果已经用pm2启动过Bot,可以直接修改进程的启动延迟:
    pm2 restart index.js --delay 10000  # 延迟10秒启动,单位是毫秒
    pm2 save  # 保存当前pm2配置,确保开机生效
    
  • 或者在创建进程时就指定延迟:
    pm2 start index.js --name discord-bot --delay 10000
    pm2 save
    
    时间可以根据你的树莓派网络初始化速度调整,一般10秒足够,慢的话可以加到15秒。

方法2:修改pm2的systemd服务依赖,等待网络完全就绪

因为你用的是systemd作为pm2的开机自启管理器,我们可以让pm2服务明确等待网络完全在线后再启动。

  1. 编辑pm2的systemd服务文件,路径一般是/etc/systemd/system/pm2-pi.service:
    sudo nano /etc/systemd/system/pm2-pi.service
    
  2. 在[Unit]部分添加两行配置:
    After=network-online.target
    Wants=network-online.target
    
    原来的After行可能是After=multi-user.target,把上面两行加上就行,确保pm2在网络完全就绪后才启动。
  3. 重新加载systemd配置并重启pm2服务:
    sudo systemctl daemon-reload
    sudo systemctl restart pm2-pi
    

方法3:在Bot代码中添加自动重连逻辑

前两种方法能解决开机的问题,但给Bot加个自动重连的保险,能应对后续可能出现的网络波动或者DNS临时故障。

在你的Discord.js代码中添加以下事件监听:

const { Client } = require('discord.js');
const client = new Client({ intents: [/* 你的Bot需要的意图 */] });

// 监听错误事件,处理DNS解析失败的情况
client.on('error', (err) => {
  console.error('Discord客户端错误:', err);
  if (err.code === 'EAI_AGAIN') {
    console.log('检测到DNS解析失败,5秒后尝试重新连接...');
    client.destroy();
    setTimeout(() => client.login('你的Bot令牌'), 5000);
  }
});

// 监听断开连接事件,自动重试
client.on('disconnect', () => {
  console.log('Bot已断开连接,5秒后尝试重新连接...');
  setTimeout(() => client.login('你的Bot令牌'), 5000);
});

client.login('你的Bot令牌');

这样即使开机时网络没准备好,Bot也会自动重试连接,直到成功。


内容的提问来源于stack exchange,提问作者hsn.unln

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:57:34