树莓派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配置,确保开机生效 - 或者在创建进程时就指定延迟:
时间可以根据你的树莓派网络初始化速度调整,一般10秒足够,慢的话可以加到15秒。pm2 start index.js --name discord-bot --delay 10000 pm2 save
方法2:修改pm2的systemd服务依赖,等待网络完全就绪
因为你用的是systemd作为pm2的开机自启管理器,我们可以让pm2服务明确等待网络完全在线后再启动。
- 编辑pm2的systemd服务文件,路径一般是
/etc/systemd/system/pm2-pi.service:sudo nano /etc/systemd/system/pm2-pi.service - 在
[Unit]部分添加两行配置:
原来的After=network-online.target Wants=network-online.targetAfter行可能是After=multi-user.target,把上面两行加上就行,确保pm2在网络完全就绪后才启动。 - 重新加载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
相关产品推荐
相关产品推荐

