python - 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 以外的其他事件
解决方案
请参阅Unix SE 上的这个答案,了解disown
实际的作用。这是与您的问题相关的部分:
但是请注意,它仍然连接到终端,因此如果终端被破坏(如果它是一个 pty,例如由 xterm 或 ssh 创建的那些,并且通过关闭 xterm 或终止 SSH 来终止控制程序,则可能会发生这种情况连接),程序将在尝试从标准输入读取或写入标准输出时立即失败。
因此on_message
,一旦print
尝试写入,您就会失败stdout
。
我可以想到几个你可以尝试的解决方案:
- 改为使用
nohup
(这是最完整的解决方案) - 重定向
stdout
(也许stderr
)到其他文件 print
stdout
通过传递file=
参数到其他地方- 用于
logging
处理您的日志并且不将它们打印到stdout
(请参阅设置日志记录)
推荐阅读
- swift - How to set the initial view to have navigation bar back button SwiftUI
- c++ - How to find cyrillic word in text
- php - Display images from outside of web directory
- c# - Discord 机器人反应数组
- go - Goroutine 阻止程序结束
- javascript - 从注入的代码发送消息到后台脚本
- vb.net - 标签中的文本显示为奇数符号 - VB.NET
- python - 在窗格窗口中使用滚动条调整 Treeview 的大小不起作用
- java - Netbeans 8.2 卡在加载屏幕消息日志
- r - 如何在 R 中对 table1 函数中的行进行子集化?