Перезапуск бота при ошибке

Приветствую, у меня есть телеграм бот на питоне, он задеполин на линукс сервер, но возникает такая проблема, что иногда бот падает и я просто физически не могу постоянно его перезапускать. У меня есть написанный скрипт, но я взял его у одного человека, он писал что этот скрипт будет перезапускать бота после рестарта серверов телеграма. Возможно ли вообще написать скрипт, который там раз в 2 секунды будет проверять работает ли бот, и если нет запускать его заново. Ниже прикреплю код скрипта который у меня есть сейчас. Буду благодарен за помощь.

[Unit]
Description=Telegram bot ‘Airdrop’
After=syslog.target
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/usr/local/bin/bot
ExecStart=/usr/bin/python3 /usr/local/bin/bot/airdrop.py
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

Возможно ли сделать автоматический перезапуск скрипта с ботом в случае ошибки в коде?

telebot.apihelper.ApiException: A request to the Telegram API was unsuccessful. The server returned HTTP 409 Conflict. Response body:
[b'{"ok":false,"error_code":409,"description":"Conflict: terminated by other getUpdates request; make sure that only one bot instance is running"}']

Пытался использовать следующий код, но так и не понял как он работает. Можете примерно объяснить?

while True:
    try:
        bot.polling(none_stop=True)

    except Exception as e:
        logger.error(e)  # или просто print(e) если у вас логгера нет,
        # или import traceback; traceback.print_exc() для печати полной инфы
        time.sleep(15)

1

systemd – cистемный менеджер, демон инициализации других демонов в Linux.

Проще говоря, systemd запустит бота и будет перезапускать его в случае падения.

Установим systemd, если отсутствует:

apt-get install systemd

Создадим файл bot.service с таким содержанием в /etc/systemd/system:

[Unit]
Description=Telegram bot %name%
After=syslog.target
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/usr/local/bin/bot  # or other path
ExecStart=/usr/bin/python3 /usr/local/bin/bot/bot.py  # or other path
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

в консоли выполним:

systemctl daemon-reload
systemctl enable bot
systemctl start bot
systemctl status bot

ответ дан 23 апр 2020 в 6:11

Violet's user avatar

VioletViolet

10k5 золотых знаков22 серебряных знака66 бронзовых знаков

При использовании телеграмм-бота на сервере, работающим под linux перезапустить упавший скрипт Python, в случае использования bot.polling, можно при помощи systemd или supervisor.

Разберем случай с менеджером системных и служб systemd.

Systemd представляет собой программный комплекс, который содержит набор системных компонентов для операционных систем Linux. Его основная цель — унифицировать конфигурацию и поведение служб в дистрибутивах Linux. Основным компонентом systemd является «менеджер систем и служб» — система инициализации, используемая для загрузки пользовательского пространства и управления пользовательскими процессами.

Проще говоря, системный менеджер systemd запустит любой скрипт (в том числе и скрипт Python телеграмм-бота) при старте системы, и будет перезапускать его в случае падения.

Установим системный менеджер systemd, если отсутствует:

$ apt-get install systemd

Создадим файл bot.service в директории /etc/systemd/system с таким содержанием:

$ sudo touch /etc/systemd/system/bot.service

Теперь откроем его

$ sudo nano /etc/systemd/system/bot.service

и вставим следующее содержимое:

[Unit]
Description=Telegram bot %name%
After=syslog.target
After=network.target

[Service]
Type=simple
User=root
# замените на свой путь к каталогу, где находится `bot.py`
WorkingDirectory=/usr/local/bin/bot  # или другой путь
# замените на свой путь к телеграмм-боту `bot.py`
ExecStart=/usr/bin/python3 /usr/local/bin/bot/bot.py  
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

в консоли выполним:

# перечитываем конфигурацию 
# (обнаружит файл `bot.service`)
$ sudo systemctl daemon-reload
# подключаем демон `bot.service`
$ sudo systemctl enable bot
# запускаем демон `bot.service`
$ sudo systemctl start bot
# смотрим статус демона `bot.service`
$ sudo systemctl status bot

ГОТОВО!

Теперь перезапустить/остановить телеграмм-бота можно системными командами Linux:

# перезапуск
$ sudo systemctl restart bot
# остановка
$ sudo systemctl stop bot
# запуск после остановки
$ sudo systemctl start bot

This is something that I’ve actually had quite the struggle to do, as a beginner, and sadly google wasn’t helpfull at all to me since everything I found was full of seemingly complex codes and all that

I’ll just answer myself below to try explaining simply what I did to do that

asked Aug 2, 2018 at 21:01

Teddy's user avatar

1

Keep in mind I am a beginner so if anything here is wrong feel free to correct me, that being said it seems to work flawlessly when it comes to restarting my wonky bot whenever it crashes

So this is what I ended up doing :

Made a new .bat file that would run and restart my bot whenever it crashed

To do that simply create a new notepad file with the following code and save it as a .bat file

@echo off
echo Starting..
:main
YourBotName.py
echo OwO what's this, the bot crashed, restarting it ;3
goto main

Just replace «YourBotName» with the appropriate file name and it should work

answered Aug 2, 2018 at 21:01

Teddy's user avatar

TeddyTeddy

1011 gold badge2 silver badges11 bronze badges

In case you want a script for a linux environment:

# /bin/sh
while true; do
    echo "Starting Bot ..."
    # The command to start your bot here
    echo "Bot crashed ... Restarting in 5 seconds..."
    sleep 5
done

answered Nov 21, 2020 at 11:53

Observer's user avatar

Возможно ли сделать автоматический перезапуск скрипта с ботом в случае ошибки в коде?

telebot.apihelper.ApiException: A request to the Telegram API was unsuccessful. The server returned HTTP 409 Conflict. Response body:
[b'{"ok":false,"error_code":409,"description":"Conflict: terminated by other getUpdates request; make sure that only one bot instance is running"}']

Пытался использовать следующий код, но так и не понял как он работает. Можете примерно объяснить?

while True:
    try:
        bot.polling(none_stop=True)

    except Exception as e:
        logger.error(e)  # или просто print(e) если у вас логгера нет,
        # или import traceback; traceback.print_exc() для печати полной инфы
        time.sleep(15)

1

systemd – cистемный менеджер, демон инициализации других демонов в Linux.

Проще говоря, systemd запустит бота и будет перезапускать его в случае падения.

Установим systemd, если отсутствует:

apt-get install systemd

Создадим файл bot.service с таким содержанием в /etc/systemd/system:

[Unit]
Description=Telegram bot %name%
After=syslog.target
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/usr/local/bin/bot  # or other path
ExecStart=/usr/bin/python3 /usr/local/bin/bot/bot.py  # or other path
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

в консоли выполним:

systemctl daemon-reload
systemctl enable bot
systemctl start bot
systemctl status bot

ответ дан 23 апр 2020 в 6:11

Violet's user avatar

VioletViolet

9,9305 золотых знаков20 серебряных знаков65 бронзовых знаков

При использовании телеграмм-бота на сервере, работающим под linux перезапустить упавший скрипт Python, в случае использования bot.polling, можно при помощи systemd или supervisor.

Разберем случай с менеджером системных и служб systemd.

Systemd представляет собой программный комплекс, который содержит набор системных компонентов для операционных систем Linux. Его основная цель — унифицировать конфигурацию и поведение служб в дистрибутивах Linux. Основным компонентом systemd является «менеджер систем и служб» — система инициализации, используемая для загрузки пользовательского пространства и управления пользовательскими процессами.

Проще говоря, системный менеджер systemd запустит любой скрипт (в том числе и скрипт Python телеграмм-бота) при старте системы, и будет перезапускать его в случае падения.

Установим системный менеджер systemd, если отсутствует:

$ apt-get install systemd

Создадим файл bot.service в директории /etc/systemd/system с таким содержанием:

$ sudo touch /etc/systemd/system/bot.service

Теперь откроем его

$ sudo nano /etc/systemd/system/bot.service

и вставим следующее содержимое:

[Unit]
Description=Telegram bot %name%
After=syslog.target
After=network.target

[Service]
Type=simple
User=root
# замените на свой путь к каталогу, где находится `bot.py`
WorkingDirectory=/usr/local/bin/bot  # или другой путь
# замените на свой путь к телеграмм-боту `bot.py`
ExecStart=/usr/bin/python3 /usr/local/bin/bot/bot.py  
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

в консоли выполним:

# перечитываем конфигурацию 
# (обнаружит файл `bot.service`)
$ sudo systemctl daemon-reload
# подключаем демон `bot.service`
$ sudo systemctl enable bot
# запускаем демон `bot.service`
$ sudo systemctl start bot
# смотрим статус демона `bot.service`
$ sudo systemctl status bot

ГОТОВО!

Теперь перезапустить/остановить телеграмм-бота можно системными командами Linux:

# перезапуск
$ sudo systemctl restart bot
# остановка
$ sudo systemctl stop bot
# запуск после остановки
$ sudo systemctl start bot

0 / 0 / 0

Регистрация: 24.09.2020

Сообщений: 1

1

Telegram Bot

24.09.2020, 20:46. Показов 16962. Ответов 8


Студворк — интернет-сервис помощи студентам

Добрый вечер. Столкнулся с такой проблемой: есть телеграм бот на python, размешен на своем сервере, у которого периодически на несколько минут отваливается интернет и бот соответственно крашится. Подскажите на примере как надо правильно прописать чтобы бот сам подключался при появлении интернета и не крашился при его отключении. Про размещении на сторонних серверах речь не идет. Спасибо большое

0

290 / 130 / 58

Регистрация: 24.11.2019

Сообщений: 532

25.09.2020, 22:23

2

Роман2323, первый способ который приходит в голову. Сделать соответствующий батник.

0

Эксперт Python

5406 / 3830 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

25.09.2020, 23:13

3

Цитата
Сообщение от Miryz
Посмотреть сообщение

первый способ который приходит в голову.

…Правильно написать код бота. С соответствующими проверками ошибок и логикой их обработки.

0

Zanzara75

2 / 2 / 0

Регистрация: 14.03.2018

Сообщений: 4

20.10.2020, 12:49

4

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import telebot
import time
import traceback
 
bot = telebot.TeleBot(token)
 
def telegram_polling():
    try:
        bot.polling()
    except:
        traceback_error_string=traceback.format_exc()
        with open("Error.Log", "a") as myfile:
            myfile.write("rnrn" + time.strftime("%c")+"rn<<ERROR polling>>rn"+ traceback_error_string + "rn<<ERROR polling>>")
        bot.stop_polling()
        time.sleep(10)
        telegram_polling()
 
telegram_polling()

ну логгирование — по желанию ))

2

Эксперт Python

5406 / 3830 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

20.10.2020, 13:30

5

Zanzara75,
1) except перехватывающий любые ошибки писать не нужно.
2) как уже неоднократно писалось ошибки коннекта к серверу возникают не в bot.polling(), поэтому этот try catch не поможет.

0

2 / 2 / 0

Регистрация: 14.03.2018

Сообщений: 4

20.10.2020, 14:43

6

ну спорить не буду…
только — у меня это работает )))

ну и надо сказать, что поллинг на aiogram при пропадании инета не крашится вусмерть, а отлично продолжает работать после появления… ну а для телебота — бот ругается после выключения сетевой карты, а потом продолжает работать, как ни в чем не бывало

0

Эксперт Python

5406 / 3830 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

20.10.2020, 17:54

7

Цитата
Сообщение от Zanzara75
Посмотреть сообщение

только — у меня это работает

на telebot’е краш происходит при попытке отправить сообщение, когда бот проработал несколько часов. Сервер telegram время от времени закрывает свой конец подключения и telebot не умеет это обрабатывать.
Другие более современные либы, я так понимаю, умеют (я ими пока не пользовался).

0

0 / 0 / 0

Регистрация: 09.11.2020

Сообщений: 1

11.11.2020, 19:21

8

на telebot’е краш происходит при попытке отправить сообщение, когда бот проработал несколько часов. Сервер telegram время от времени закрывает свой конец подключения и telebot не умеет это обрабатывать.

Укажите, пожалуйста, куда копать, чтобы ловить эти исключения

0

Эксперт Python

5406 / 3830 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

12.11.2020, 19:39

9

Цитата
Сообщение от panohin
Посмотреть сообщение

куда копать,

Открыть исходники telebot и понять как это все работает.
Или забить и пользоваться более новыми либами.

0

Приветствую всех. Из этой статьи вы узнаете как запустить Telegram бота на виртуальном сервере, и настроить службу для его авто запуска и перезапуска.

Телеграм бот

#main.py
import telebot

bot = telebot.TeleBot("ТОКЕН")

@bot.message_handler(func=lambda message: message.text.lower() in ['привет', 'здравствуйте'])
def send_welcome(message):
    bot.reply_to(message, "Здравствуйте!")

@bot.message_handler(func=lambda message: True)
def echo_all(message):
    bot.reply_to(message, 'Я тебя не понимаю(')

bot.infinity_polling()

Виртуальный сервер

Для демонстрации я буду использовать виртуальный сервер от Beget стоимостью 210
рублей в месяц. Вы можете использовать другого хостинг провайдера, или выбрать другую конфигурацию, в зависимости от вашего проекта.

Как запустить Python Telegram бота на VPS

Подключение к виртуальной машине

После того как вы создали VPS у вас откроется панель управления, где вы можете скопировать IP адрес машины и подключаться к ней по SSH.

Как запустить Python Telegram бота на VPS

Для этого можно использовать программу PuTTY или клиент OpenSSH, который входит в состав Windows 10. Для подключения по SSH выполните следующую команду:

ssh root@213.139.209.81

И введите пароль который вы указали при создании VPS.

Подготовка сервера

После того как вы подключились к серверу, выполните команды которые обновят списки, и устаревшие пакеты до последней версии.

sudo apt update
sudo apt upgrade

Загрузка и запуск бота

Перейдите в каталог home и создайте папку для вашего проекта выполнив команды.

cd /home
mkdir ramziv_bot
cd ramziv_bot

Зайдите панель управления VPS и откройте Файловый менеджер.

Как запустить Python Telegram бота на VPS

Загрузите файлы вашего проекта на сервер, в моем случаи это только один файл main.py.

Как запустить Python Telegram бота на VPS

Установите зависимости вашего проекта, и запустите бота.

Примечание: Ubuntu 20.04 поставляется с установленной Python 3.8 из коробки, если для вашего проекта нужна другая версия, установите ее или используйте другую версию дистрибутива.

pip install pyTelegramBotAPI
python3 main.py 

Теперь перейдите в Телеграм и протестируйте работу.

Как запустить Python Telegram бота на VPS

Работает.

Авто запуск и перезапуск телеграм бота

Создайте systemd службу для бота.

sudo nano /lib/systemd/system/ramziv_bot.service

С конфигурацией:

[Unit]
Description=Ramziv - Telegram Bot
After=syslog.target
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/ramziv_bot/
ExecStart=/usr/bin/python3 /home/ramziv_bot/main.py
RestartSec=60
Restart=always

[Install]
WantedBy=multi-user.target

Нажмите CTRL+S и CTRL+X что бы сохранить и выйти.

Выполните эти две команды что бы запустить службу.

sudo systemctl enable ramziv_bot
sudo systemctl start ramziv_bot

Ваш бот запушен. Перейдите в Телеграм и убедитесь в этом.

Заключение

Ваш бот будет всегда запускаться при старте системы, и перезапускается при возникновении ошибки. Для примера вы можете специально вызвать исключения в одной из функций обернутой обработчиком, и отследить ее в журнале командой:

sudo journalctl -u ramziv_bot.service

#Вывод
#Jun 13 12:35:31 objmnuqxoa python3[1069]:   File "/home/ramziv_bot/main.py", line 7, in send_welcome
#Jun 13 12:35:31 objmnuqxoa python3[1069]:     number = 1/0
#Jun 13 12:35:31 objmnuqxoa python3[1069]: ZeroDivisionError: division by zero


22

ответов

ну бот в разработке, чтоб он новые функции загрузил.

я не пробовал, но можно попробовать через subprocess наверн


Mars BATYA [NYА]

я не пробовал, но можно попробовать через subproce…

но имхо, можно подойти к этому с умом и юзать либу importlib, чтобы перезагружать не всего бота, а только измененный файл


Mars BATYA [NYА]

но имхо, можно подойти к этому с умом и юзать либу…

ну вообще умные люди уже придумали модули для перезагрузки проекта


Mars BATYA [NYА]

но имхо, можно подойти к этому с умом и юзать либу…

Ужасно, это не прокатит в 99% случаев


Aleksandr Danilov

gitlab, иди ты нахуй

он из коробки умеет измененный файл в запущенном боте перезагружать?

Я заметил что многие путают использование мата с токсичностью.

Это пиздец как грустно


Aleksandr Danilov

Я заметил что многие путают использование мата с т…

я не о том, друг
это не токсичность в чистом виде, ты прав, но обильное использование мата делает речь так или иначе более грубой, тем более если мы не слышим позитивную интонацию (что в рамках текстовых сообщений невозможно)


Денис 🐍|👑 | darling! 🥰

я не о том, друг
это не токсичность в чистом виде,…

вот это куда точнее, и с этим я вполне согласен.

Речь не то что бы грубее конечно, скорее эмоциональнее, плюс моя манера написания


Aleksandr Danilov

вот это куда точнее, и с этим я вполне согласен.

со стороны (учитывая то что ты не выражаешь радость по поводу хорошего события, а скорее ведешь дискуссию или, в конкретном контексте, напоминаешь про существование определенного сервиса), эмоция выглядит не особо позитивной, а следовательно мат формирует (опять же, со стороны) более яркую негативную эмоцию (которая без мата бы была околонейтральной)


Денис 🐍|👑 | darling! 🥰

со стороны (учитывая то что ты не выражаешь радост…

Это называется домыслом, и это порой хуёво.


🅸🄶🄾🅁 🆃🄾🄻🅂🅃🄾🅅

По каким словам гуглить ?

Если речь идёт про перезапуск при редактировании во время разработки бота то наверное что-то такое подойдёт

https://github.com/gorakhargosh/watchdog

Или посмотреть как в ювикорне сделано

https://github.com/encode/uvicorn/blob/master/uvicorn/supervisors/watchgodreload.py

зачем тогда придумали реакции?


Макс 🇺🇦 🇺🇦

зачем тогда придумали реакции?

лучше уж пусть плюсанет, словлю меншн и чекну, чем будет висеть это ссаное сердечко в списке чатов


Макс 🇺🇦 🇺🇦

зачем тогда придумали реакции?

У меня клиент без реакций

  • Перенос на ios ошибка переноса
  • Перезагрузите чтобы устранить ошибки диска перезагрузка не помогает
  • Перенашивал идею лексическая ошибка
  • Перезагрузите чтобы устранить ошибки диска win 10 что это
  • Перенапряжение зпт ошибки частотника altivar 71