@EVG82

Снижается версия Python почему?

От хостера имею
виртуальное окружение на python 3.8
не VPS у меня
так что прав мало
все поставилось и заработал bot
сеанс через putty

закрыл сеанс- бот перестал работать

создал сеанс заново и решил проверить версию python
сменилась сама по себе с 3.8 на 2,75 на самую старую от хостера

1 Проблема у хостера? Молчит пока
2 Проблема в текущем коде?

import telebot

token = '5045270686:AAEOxCH'
bot = telebot.TeleBot(token)
GROUP_ID = "@buest"
inputfile = '1.txt'
f = open(inputfile, mode='r', encoding='utf-8')
blacklist = list(map(str.strip, f.readlines()))

@bot.message_handler(content_types=["text"])
def handle_text(message):
    for x in blacklist:
        if (x in message.text):
            bot.delete_message(message.chat.id, message.message_id)
        else:
            pass


if __name__ == "__main__":
    bot.infinity_polling()

может он заточен под 2.7.5?
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Нужно немножко включить голову и почитать про то, как работает SSH и оболочка Unix системы. Гуглинг типа "SSH keep program running" быстро бы вывел тебя на то что нужно.
1. Когда ты подключаешься по SSH, сервер запускает копию bash или sh (или какая там оболочка используется) с правами твоего пользователя.
<br>
sshd<br>
  - bash<br>

При вводе команды в этой оболочке программа ищется в системном PATH, а в нём находится второй питон.

2. Потом, когда ты делаешь activate, ты переходишь в виртуальное окружение. Оно отличается тем, что питон там ищется по умолчанию другой, так как там поменян PATH (и ещё кое что). И происходит этот переход за счёт запуска дочерней командной оболочки.
<br>
sshd<br>
  - bash<br>
      - activate <br>
          - bash<br>


3. Ты запускаешь свой скрипт. Он запускается из под оболочки внутри activate.
<br>
sshd<br>
  - bash<br>
      - activate<br>
          - bash<br>
              - python3 your_script.py<br>


4. Ты закрываешь putty. SSH сервер регистрирует отключение клиента, и посылает дочернему bash сигнал HUP - обычно он интерпретируется как сигнал на завершение. Тот передаёт этот сигнал своему дочернему процессу, и так далее.
<br>
sshd "sshd: эй, bash, завершайся"<br>
  - bash "bash: эй, activate, завершайся. А теперь я сам завершусь."<br>
      - activate "activate: эй, bash, завершайся. А теперь я сам завершусь"<br>
          - bash "bash: эй, python3, завершайся. А теперь я сам завершусь"<br>
              - python3 your_script.py "python3: хорошо, завершаюсь."<br>

В итоге получаем только работающий ssh сервер
sshd
И когда ты переоткрываешь сессию, activate уже перестал существовать, и ты снова попадаешь в обычный bash, где в PATH прописан только второй питон.

Теперь главное: как же это обойти? Нужно сделать так, чтобы python3 проигнорировал сигнал о завершении. Есть несколько способов.
Самый простой - использовать такой синтаксис:
nohup python3 your_script.py &
Амперсанд в конце означает "запусти программу и вернись в оболочку, не дожидаясь когда программа закончит работать". А команда nohup запускает указанную программу с указанными аргументами, но при этом она проигнорирует сигнал HUP, т.е. "эй, завершайся". А потому когда ты закроешь putty, бот должен остаться работать.
Минус - после переподключения ты не будешь видеть вывод бота в консоль. Так что пиши логи!
Чтобы остановить бота, придётся использовать ps чтобы узнать ID его процесса, и kill чтобы этот процесс прибить. Ну или можешь предусмотреть команду выхода в самом боте, которая завершит работу скрипта изнутри. Это удобнее.

Второй способ - использовать программу screen, если она установлена. Документацию по ней гугли. Если коротко, screen позволяет создать виртуальную рабочую сессию, к которой можно подключатсья и отключаться, не прерывая её. При этом весь вывод на экран сохраняется между переподключениями. Удобно если бот пишет много в консоль, но несколько муторно, и надо учить сочетания клавиш.

Третий способ - сделать так, чтобы бот запускался при загрузке, через init.d скрипт или systemd модуль. Но так как у тебя минимальные права, скорее всего это не прокатит.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы