discord.py on_message перестает работать после отказа от работы с Linux и отключения - PullRequest
1 голос
/ 17 мая 2019

Я пишу бот-дискорд на python, и он прекрасно работает с 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

при подключении через putty on_message, а все остальные события вызывают

и когда я отключаю соединение ssh с сервером linux с этого момента он будет запускать другие события, такие как on_voice_state_update, но не on_message

Я ожидал, что я смогу позволить боту отречься, и он все равно будет работать. Но это работает только для других событий, кроме on_message

1 Ответ

1 голос
/ 17 мая 2019

См. этот ответ в Unix SE о том, что на самом деле делает disown.Вот часть, относящаяся к вашему вопросу:

Однако обратите внимание, что он все еще подключен к терминалу, поэтому, если терминал разрушен (что может произойти, если он был pty, как те, что были созданы xterm илиssh, и управляющая программа завершается, закрывая xterm или прерывая соединение SSH), программа завершится ошибкой, как только она попытается прочитать со стандартного ввода или записать в стандартный вывод.

Итакваш on_message терпит неудачу, как только print пытается записать в stdout.

Я могу придумать пару решений, которые вы можете попробовать:

  1. Использовать nohup вместо этого (это наиболее готовое решение)
  2. Перенаправить stdout (и, возможно, stderr) в другой файл
  3. print в другое место, отличное от stdout, передавfile= аргумент
  4. Используйте logging для обработки журналов и не печатайте их в stdout (см. Настройка ведения журнала )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...