如何避免在 Discord 服务器中出现多个机器人实例
Posted
技术标签:
【中文标题】如何避免在 Discord 服务器中出现多个机器人实例【英文标题】:How to avoid multiple instance of a bot in Discord server 【发布时间】:2020-10-11 22:44:49 【问题描述】:我创建了一个在私人服务器上运行的机器人。该机器人检查当前日期时间并在特定时间发出命令。 我在以前版本的机器人中经历了多次断开连接,这似乎是由不和谐问题引起的。然后我的解决方案是设置一个 cron 命令以每小时重新启动机器人,以防它之前崩溃。现在,我的机器人运行良好,但似乎我在服务器中有多个机器人实例,因为每条消息都发送了 4 或 5 次。
是否有办法检查节点服务器是否已经处于活动状态或机器人是否已经登录?
定时任务:
00 * * * * cd C:/Users/[...]/bot/ && node bootstrap.js
机器人构造函数:
让 self = this; this.file = './env/env_'+pEnv+'.json'; //环境文件 让 tmpData = _FS.readFileSync(this.file); this.params = JSON.parse(tmpData); //定时器设置 this.interval = setInterval(function()self.checkTimer();,1000); //Discord客户端启动 this.client = new _DISCORD.Client(); this.client.login(pToken); this.client.on('准备好了', () => self.init(); ); self.client.on('消息', (pMessage) => self.reacts(pMessage); ); ```
【问题讨论】:
【参考方案1】:您将cron
设置为每小时运行一次,这将每小时执行一个新实例,即使已经有一个实例正在运行。我建议使用
Forever 确保应用在关闭时重新启动。
您可以使用forever start app.js
运行它,它会为您提供所需的内容。
【讨论】:
这看起来很好,它可以保护应用程序崩溃。但是电力短缺怎么办?使用 cron,我确信该命令将再次自行运行。如果我在 cron 中执行 Forever 命令,它会运行多个实例吗? 如果进程关闭,永远只会重新启动,因此很可能永远不会有超过一个机器人实例。我建议完全放弃 cron。您的实际问题是 cron 每小时都在运行,这只会每小时不断创建新实例。尝试使用forever start app.js
看看是否有帮助。
@MichaelMaurel 你可以做一个@reboot forever start app.js
的crontab,它会在服务器启动时启动机器人。这可以处理电源故障和应用程序崩溃。
所以...我尝试使用@reboot 创建一个简单的文件,只是为了检查语法是否被接受,并且它有效。然后我尝试了以下两种解决方案,但均未成功:首先,直接在 cron 中:@reboot sleep 30 && cd /home/me/[...] && forever start myScript.js
;其次,使用 sh 文件(该文件在手动调用时有效):@reboot /home/me/[...]/doOnReboot.sh
找到了解决方案。 cron 调用 .sh 脚本,但为了让它工作,我调用了完整路径。 [cron] : @reboot /home/me/Documents/doOnReboot.sh
// [脚本] : cd /home/me/[...]/ && /usr/local/bin/forever start myScript.js
以上是关于如何避免在 Discord 服务器中出现多个机器人实例的主要内容,如果未能解决你的问题,请参考以下文章
Discord.js - 如何实现前缀以避免错误触发命令响应?