discord.py on_message在放弃linux作业并断开连接后停止工作

时间:2019-05-16 21:55:29

标签: python linux discord.py

我正在用python写一个discord-bot,它可以从IntelliJ甚至从Terminal运行。

当我尝试让它在不连接的情况下在linux服务器上运行时,问题就开始了

    # Called when a message is created and sent to a server.
    # Parameters:   message – A Message of the current message.
    async def on_message(self, message):
        print('Message from {0.author}: {0.content}'.format(message))
        if message.author == self.user:
            return
        try:
            await self.serverLog.on_message(message)
        except Exception as e:
            logger.exception(e)
        try:
            await self.werwolfBot.on_message(message)
        except Exception as e:
            logger.exception(e)

我通过命令行启动机器人

cd WerwolfBot
python3.6 -m werwolf &
disown

在仍然通过腻子on_message连接时,其他所有事件也会触发

当我断开与Linux服务器的ssh连接时 从那时起,它将触发其他事件,例如on_voice_state_update,但不会触发on_message

我希望我可以让该漫游器不运行,并且仍然可以运行。但这仅适用于on_message以外的其他事件

1 个答案:

答案 0 :(得分:1)

有关disown的实际用途,请参见this answer on Unix SE。这是与您的问题有关的部分:

  

但是请注意,它仍然连接到终端,因此如果终端被破坏(如果是pty,则可能会发生这种情况,例如xterm或ssh创建的终端,并且通过关闭xterm或终止SSH连接),该程序将在尝试从标准输入读取或写入标准输出时失败。

因此,on_message一旦尝试写入print,您的stdout就会失败。

我想到了您可以尝试的几种解决方案:

  1. 改为使用nohup(这是最完善的解决方案)
  2. stdout(可能还有stderr)重定向到其他文件
  3. 通过传递print自变量
  4. stdoutfile=之外的其他地方
  5. 使用logging处理日志,不要将其打印到stdout(请参阅Setting Up Logging