远程机器人不会停止和启动
telebot won't stop and start
我试图每 10 秒重新启动我的机器人(为了测试,我想每 10 分钟左右重新启动一次),但我似乎无法做到。
我试过:
const TeleBot = require('telebot');
const bot = new TeleBot({
token:'mytoken',
polling:true
});
setInterval(function(){ bot.start()},9000);
setInterval(function(){ bot.stop()},10000);
它说机器人启动和停止,但是当它第二次启动时它说:
[bot.error.update] {
ok: false,
error_code: 409,
description: 'Conflict: terminated by other getUpdates request; make sure that only one bot instance is running'
}
但是如果 bot 停止,则应该只有没有 bot 的实例 运行。
有没有办法完全停止机器人?
非常有趣的问题,我猜这个问题是由 setInterval
的 inaccuracy 引起的,这会导致那些 setInterval
不同步。 (因此,例如,您将尝试启动机器人,而它已经处于活动状态)
我们可以使用 Telebot documentation shows us there are some TeleBot Events 来确保我们只在需要时调用 start()
/ stop()
;
const TeleBot = require('telebot');
const bot = new TeleBot({
token:'********:AAEibBwftjTEKuYd9d2X0ACeyyzTk4DLe60',
polling:true
});
// Create event listener for bot-stop
bot.on('stop', (data) => {
// After 5 seconds, START the bot
setTimeout(function(){
bot.start()
}, 5 * 1000);
});
// Create event listener for bot-start
bot.on('start', (data) => {
// After 10 seconds, STOP the bot
setTimeout(function(){
bot.stop('Interval stop()')
}, 10 * 1000);
});
// Start for first time
bot.start()
使用这种方法,我的机器人已经关闭和打开大约 25 60 分钟,没有任何问题:
MBP ➜ telebot node startEnStop.js
[bot.plugin] loaded 'regExpMessage' plugin
[bot.plugin] loaded 'shortReply' plugin
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
...
确保机器人已经停止并且没有任何残留。
您可以将它放在自己的节点脚本中,然后 运行 使用:
const { fork } = require('child_process');
const controller = new AbortController();
const child = fork("your_script.js", { controller });
setTimeout(function()
{
controller.abort(); // Stops the child process
}, 10000);
来自您的主控或“cron 作业”脚本”。
请记住,这将终止该进程,因此它不会有任何机会进行任何清理,所以如果您想先温和地终止该进程。首先通过管道将消息传递给子进程,以便它可以尝试自行终止。
感谢所有试图提供帮助的人。
但我想出了一个 hacky 解决方案。
我将我的文件从 heroku 移动到 vps,然后我安装了 pm2 并将其设置为 运行 节点 index.js(我的主要 js 文件),然后我安装了 cron 和通过键入 crontab -e 将其设置为每 10 分钟重新启动 pm2 并键入以下内容:
*/10 * * * * pm restart 0
现在我的机器人每 10 分钟重启一次。
我试图每 10 秒重新启动我的机器人(为了测试,我想每 10 分钟左右重新启动一次),但我似乎无法做到。 我试过:
const TeleBot = require('telebot');
const bot = new TeleBot({
token:'mytoken',
polling:true
});
setInterval(function(){ bot.start()},9000);
setInterval(function(){ bot.stop()},10000);
它说机器人启动和停止,但是当它第二次启动时它说:
[bot.error.update] { ok: false, error_code: 409, description: 'Conflict: terminated by other getUpdates request; make sure that only one bot instance is running' }
但是如果 bot 停止,则应该只有没有 bot 的实例 运行。 有没有办法完全停止机器人?
非常有趣的问题,我猜这个问题是由 setInterval
的 inaccuracy 引起的,这会导致那些 setInterval
不同步。 (因此,例如,您将尝试启动机器人,而它已经处于活动状态)
我们可以使用 Telebot documentation shows us there are some TeleBot Events 来确保我们只在需要时调用 start()
/ stop()
;
const TeleBot = require('telebot');
const bot = new TeleBot({
token:'********:AAEibBwftjTEKuYd9d2X0ACeyyzTk4DLe60',
polling:true
});
// Create event listener for bot-stop
bot.on('stop', (data) => {
// After 5 seconds, START the bot
setTimeout(function(){
bot.start()
}, 5 * 1000);
});
// Create event listener for bot-start
bot.on('start', (data) => {
// After 10 seconds, STOP the bot
setTimeout(function(){
bot.stop('Interval stop()')
}, 10 * 1000);
});
// Start for first time
bot.start()
使用这种方法,我的机器人已经关闭和打开大约 25 60 分钟,没有任何问题:
MBP ➜ telebot node startEnStop.js
[bot.plugin] loaded 'regExpMessage' plugin
[bot.plugin] loaded 'shortReply' plugin
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
...
确保机器人已经停止并且没有任何残留。
您可以将它放在自己的节点脚本中,然后 运行 使用:
const { fork } = require('child_process');
const controller = new AbortController();
const child = fork("your_script.js", { controller });
setTimeout(function()
{
controller.abort(); // Stops the child process
}, 10000);
来自您的主控或“cron 作业”脚本”。 请记住,这将终止该进程,因此它不会有任何机会进行任何清理,所以如果您想先温和地终止该进程。首先通过管道将消息传递给子进程,以便它可以尝试自行终止。
感谢所有试图提供帮助的人。
但我想出了一个 hacky 解决方案。
我将我的文件从 heroku 移动到 vps,然后我安装了 pm2 并将其设置为 运行 节点 index.js(我的主要 js 文件),然后我安装了 cron 和通过键入 crontab -e 将其设置为每 10 分钟重新启动 pm2 并键入以下内容:
*/10 * * * * pm restart 0
现在我的机器人每 10 分钟重启一次。