我正在用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以外的其他事件
答案 0 :(得分:1)
有关disown
的实际用途,请参见this answer on Unix SE。这是与您的问题有关的部分:
但是请注意,它仍然连接到终端,因此如果终端被破坏(如果是pty,则可能会发生这种情况,例如xterm或ssh创建的终端,并且通过关闭xterm或终止SSH连接),该程序将在尝试从标准输入读取或写入标准输出时失败。
因此,on_message
一旦尝试写入print
,您的stdout
就会失败。
我想到了您可以尝试的几种解决方案:
nohup
(这是最完善的解决方案)stdout
(可能还有stderr
)重定向到其他文件print
自变量stdout
到file=
之外的其他地方logging
处理日志,不要将其打印到stdout
(请参阅Setting Up Logging)