首页 > 解决方案 > discord.py on_message 在放弃 linux 作业并断开连接后停止工作

问题描述

我正在用 python 编写一个不和谐的机器人,它可以从 IntelliJ 甚至从终端运行。

当我尝试让它在没有连接到它的情况下在 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

虽然仍然通过 putty on_message 连接,但所有其他事件都会触发

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

我希望我可以让机器人运行否认它仍然可以工作。但它仅适用于 on_message 以外的其他事件

标签: pythonlinuxdiscord.py

解决方案


请参阅Unix SE 上的这个答案,了解disown实际的作用。这是与您的问题相关的部分:

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

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

我可以想到几个你可以尝试的解决方案:

  1. 改为使用nohup(这是最完整的解决方案)
  2. 重定向stdout(也许stderr)到其他文件
  3. printstdout通过传递file=参数到其他地方
  4. 用于logging处理您的日志并且不将它们打印到stdout(请参阅设置日志记录

推荐阅读