Приветствую, у меня есть телеграм бот на питоне, он задеполин на линукс сервер, но возникает такая проблема, что иногда бот падает и я просто физически не могу постоянно его перезапускать. У меня есть написанный скрипт, но я взял его у одного человека, он писал что этот скрипт будет перезапускать бота после рестарта серверов телеграма. Возможно ли вообще написать скрипт, который там раз в 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
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
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
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
Возможно ли сделать автоматический перезапуск скрипта с ботом в случае ошибки в коде?
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
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 |
5406 / 3830 / 1214 Регистрация: 28.10.2013 Сообщений: 9,554 Записей в блоге: 1 |
|
25.09.2020, 23:13 |
3 |
первый способ который приходит в голову. …Правильно написать код бота. С соответствующими проверками ошибок и логикой их обработки. 0 |
Zanzara75 2 / 2 / 0 Регистрация: 14.03.2018 Сообщений: 4 |
||||
20.10.2020, 12:49 |
4 |
|||
ну логгирование — по желанию )) 2 |
5406 / 3830 / 1214 Регистрация: 28.10.2013 Сообщений: 9,554 Записей в блоге: 1 |
|
20.10.2020, 13:30 |
5 |
Zanzara75, 0 |
2 / 2 / 0 Регистрация: 14.03.2018 Сообщений: 4 |
|
20.10.2020, 14:43 |
6 |
ну спорить не буду… ну и надо сказать, что поллинг на aiogram при пропадании инета не крашится вусмерть, а отлично продолжает работать после появления… ну а для телебота — бот ругается после выключения сетевой карты, а потом продолжает работать, как ни в чем не бывало 0 |
5406 / 3830 / 1214 Регистрация: 28.10.2013 Сообщений: 9,554 Записей в блоге: 1 |
|
20.10.2020, 17:54 |
7 |
только — у меня это работает на telebot’е краш происходит при попытке отправить сообщение, когда бот проработал несколько часов. Сервер telegram время от времени закрывает свой конец подключения и telebot не умеет это обрабатывать. 0 |
0 / 0 / 0 Регистрация: 09.11.2020 Сообщений: 1 |
|
11.11.2020, 19:21 |
8 |
на telebot’е краш происходит при попытке отправить сообщение, когда бот проработал несколько часов. Сервер telegram время от времени закрывает свой конец подключения и telebot не умеет это обрабатывать. Укажите, пожалуйста, куда копать, чтобы ловить эти исключения 0 |
5406 / 3830 / 1214 Регистрация: 28.10.2013 Сообщений: 9,554 Записей в блоге: 1 |
|
12.11.2020, 19:39 |
9 |
куда копать, Открыть исходники 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
рублей в месяц. Вы можете использовать другого хостинг провайдера, или выбрать другую конфигурацию, в зависимости от вашего проекта.
Подключение к виртуальной машине
После того как вы создали VPS у вас откроется панель управления, где вы можете скопировать IP адрес машины и подключаться к ней по SSH.
Для этого можно использовать программу 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 и откройте Файловый менеджер.
Загрузите файлы вашего проекта на сервер, в моем случаи это только один файл main.py
.
Установите зависимости вашего проекта, и запустите бота.
Примечание: Ubuntu 20.04 поставляется с установленной Python 3.8 из коробки, если для вашего проекта нужна другая версия, установите ее или используйте другую версию дистрибутива.
pip install pyTelegramBotAPI
python3 main.py
Теперь перейдите в Телеграм и протестируйте работу.
Работает.
Авто запуск и перезапуск телеграм бота
Создайте 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
зачем тогда придумали реакции?
Макс 🇺🇦 🇺🇦
зачем тогда придумали реакции?
лучше уж пусть плюсанет, словлю меншн и чекну, чем будет висеть это ссаное сердечко в списке чатов
Макс 🇺🇦 🇺🇦
зачем тогда придумали реакции?
У меня клиент без реакций