Как перезапустить бота на питоне

Запускаем Python-скрипт на сервере, чтобы он работал всё время

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

Сейчас нам нужно такое решение, чтобы бот автоматически перезапускался при любых обстоятельствах. Этим и займёмся.

Коротко — суть

Чтобы было понятно, что тут происходит, вот короткая версия:

  1. Настраиваем удалённый доступ к серверу.
  2. Создаём папку и заливаем в неё скрипт, который в итоге должен будет работать всё время.
  3. Создаём у себя на компьютере файл службы — он управляет настройками автозапуска скрипта.
  4. Отправляем файл службы на сервер.
  5. Обновляем на сервере данные обо всех службах и запускаем нашу.

Теперь подробно про каждый шаг.

Предварительная работа

Основное, что мы будем использовать, — это удалённый доступ к серверу по SSH. Для этого он должен быть включён на самом сервере, и там же можно сразу посмотреть параметры доступа. Например, для работы нашего учебного сервера мы пользуемся услугами SpaceWeb, где доступ по SSH включается из панели управления:

Запускаем Python-скрипт на сервере, чтобы он работал всё время

Запускаем SSH и проверяем, что соединение устанавливается. Чтобы соединиться, нужно написать в терминале команду ssh имя_пользователя@адрес_сервера, после чего нажать Enter. Сервер спросит пароль, и, если мы его правильно ввели, нас пустят.

Читайте также:  Css сбросить все стили button

Запускаем Python-скрипт на сервере, чтобы он работал всё время

Мы видим приветствие сервера, значит, всё прошло хорошо и мы можем управлять им со своего компьютера. Для этого нужно будет писать в терминал команды и реагировать на то, что тебе ответит сервер.

Отправляем скрипт на сервер

Чтобы не захламлять корневую папку на сервере, создадим новую папку bot. Вот эта команда:

После этого открываем новую командную строку на компьютере, а не на сервере. Для этого нужно запустить ещё одно окно терминала. Там пишем такое:

scp /Users/mihailpolanin/Downloads/bot.py mpolyanin@77.222.61.9:bot

  • scp — копирование файла по SSH;
  • /Users/mihailpolanin/Downloads/bot.py — это путь к нашему скрипту на компьютере. Его замените на то, что будет у вас;
  • mpolyanin@77.222.61.9 — адрес сервера и логин пользователя. Это тоже замените на ваши данные;
  • : — отделяет сервер от папки;
  • bot — название папки, которую мы только что создали на сервере.

Лайфхак: чтобы не писать вручную пути до файлов на локальном компьютере, можно перед началом ввода пути просто перетащить файл в окно терминала. Терминал поймёт, что вы имели в виду «путь до этого файла», и подставит данные сам.

После запуска у нас попросят пароль от сервера — вводим его и видим статистику отправки файла:

Запускаем Python-скрипт на сервере, чтобы он работал всё время

Переключаемся обратно в SSH-соединение и проверяем, что файл скопировался и лежит в папке. Для этого вводим две команды: первая перейдёт в эту папку, а вторая покажет её содержимое:

Запускаем Python-скрипт на сервере, чтобы он работал всё время

Готовим файл для работы службы

Нам нужно, чтобы система сама следила за тем, чтобы скрипт работал всё время и запускался после перезагрузки. В Linux за это отвечают службы — одну из таких служб мы сейчас и сделаем.

Создаём на компьютере новый файл bot.service и вставляем туда такое:

[Unit] Description=tg-bot After=multi-user.target [Service] User=root Group=root Type=simple Restart=always ExecStart=/usr/bin/python3 /bot/bot.py [Install] WantedBy=multi-user.target

Два самых важных параметра — это путь к нашему скрипту (/bot/bot.py) и название службы: tg-bot. Название может быть любым, а вот путь к скрипту нужно указать точно.

Теперь закидываем этот файл на сервер в папку /usr/lib/systemd/system. Для этого в командной строке компьютера пишем:

scp /Users/mihailpolanin/Downloads/bot.service mpolyanin@77.222.61.9:/usr/lib/systemd/system

Как и раньше, не забудьте заменить адрес до файла .service на вашем компьютере, а также имя пользователя и адрес сервера. Первый адрес можно не писать вручную, а перетащить файл в терминал сразу после набора команды scp.

Запуск службы

Теперь нам нужно перезагрузить все службы, чтобы наш файл тоже попал в общий список для запуска. Открываем SSH-консоль и выполняем там такую команду:

sudo systemctl daemon-reload

И сразу включим наш сервис, чтобы он не отключался при перезагрузке сервера:

sudo systemctl enable bot.service

Всё, можно запускать наш телеграм-бот как службу. Вот основные команды для этого:

  • sudo systemctl start bot.service — запустить службу;
  • sudo systemctl stop bot.service — остановить службу;
  • sudo systemctl status bot.service — посмотреть статус, работает или нет.

Что дальше

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

Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём!

В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.

Источник

Как перезагрузить телеграмм бот?

Друзья! Пишу бота в телеграме. Использую библиотеку telebot. Добавил клавиатуру для ответов. Мне необходимо, чтобы при нажатии на кнопку бот перезагружался. Возможно ли сделать такое? Если да, то напишите просто команду, заранее Спасибо! Читал документацию. Что-то не смог найти решение

SuckMyPython

import os #импортируем модуль "os" @bot.message_handler(commands=["restart"]) #вызов по команде /restart; можно сделать и на кнопку def restart(message): pid = str(os.getpid()) #получаем ProcessID запущенного бота restarter = open('restarter.bat', 'w') #открываем/создаем батник restarter.write('Taskkill /PID ' + pid + ' /F\nTIMEOUT /T 5 /NOBREAK\ncd C:\\Users\\smp\\Desktop\\SMP\\\nsmp.py') #записываем скрипт в батник restarter.close() #закрываем отредактированный батник os.system('C:/Users/smp/Desktop/SMP/restarter.bat') #запускаем наш батник

SuckMyPython

Taskkill /PID #Убиваем процесс по его id pid #переменная с pid`ом нашего процесса /F #убивать процесс будем принудительно \n #новая строка(абзац) - для батника это следующая команда TIMEOUT /T 5 /NOBREAK #таймаут \n #новая строка(абзац) cd C:\\Users\\smp\\Desktop\\SMP\\ #переход в директорию с ботом (надо экранировать слэши \ -> \\) \n #новая строка(абзац) smp.py #запускаем бота

Источник

Как перезапустить бота кодом, при нажатии inline кнопки(pytelegrambotapi)?

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

Соответственно сначала бот пишет «Введите имя», а потом он думает что я ввожу фамилию, и выдаёт результат «Вас зовут» + имя и фамилия введённая пользователем, затем такую ошибку:

2021-10-31 21:53:34,798 (__init__.py:663 MainThread) ERROR - TeleBot: "A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request : message to delete not found" 

Как можно при нажатии inline кнопки сбросить работу программы, перезапустить бота и начать сначала? Чтобы при каждом нажатии на inline кнопку, скрипт будто закрыли и открыли заново. Не знаю как сделать это кодом, чтобы бот работал без остановки 24/7.

Ответы (1 шт):

Можно повторно вызывать функцию send_welcome прямо из inline_handler , которая ловит нажатие кнопки сброса.

А в самой функции send_welcome сбрасывать все зарегистрированные обработчики с помощью вызова bot.clear_step_handler(message) .

Тогда если send_welcome вызвана первый раз, никаких обработчиков еще не установлено и ничего не произойдет, а если повторно — они будут сброшены, как и требуется.

@bot.message_handler(commands=["start"]) def send_welcome(message): global DELETEuserName1 bot.clear_step_handler(message) userName = bot.send_message(message.chat.id, "Здравствуйте, введите имя") DELETEuserName1 = userName.message_id bot.register_next_step_handler(userName, userSurNameFUNC) def userSurNameFUNC(message): global userName, DELETEuserSurName, DELETEuserSurName1 userName = message.text markup = types.InlineKeyboardMarkup() resetDataKey = types.InlineKeyboardButton("Сбросить", callback_data="resetData") markup.add(resetDataKey) userSurName = bot.send_message(message.chat.id, "Теперь введите фамилию", reply_markup=markup) DELETEuserSurName = userSurName.chat.id DELETEuserSurName1 = userSurName.message_id bot.delete_message(message.chat.id, message.message_id) bot.delete_message(message.chat.id, DELETEuserName1) bot.register_next_step_handler(userSurName, endProgrammFUNC) def endProgrammFUNC(message): global userSurName, DELETEendProgramm, DELETEendProgramm1 userSurName = message.text endProgramm = bot.send_message(message.chat.id, "Вас зовут " + userName + " " + userSurName) DELETEendProgramm = endProgramm.chat.id DELETEendProgramm1 = endProgramm.message_id bot.delete_message(message.chat.id, message.message_id) bot.delete_message(DELETEuserSurName, DELETEuserSurName1) @bot.callback_query_handler(func=lambda call: True) def inline_handler(call): if call.data == "resetData": bot.delete_message(call.message.chat.id, call.message.message_id) send_welcome(call.message) bot.infinity_polling() 

Источник

Можно ли перезапустить код бота?

Как можно перезапустить форму
Какой командой можно перезапустить форму или приложение что-бы не выходить из нее. Для каждого.

Можно ли перезапустить отдоленную робочую станчию НТ?
Можно ли перезапустить отдоленную робочую станчию НТ. Если можн то как.

Как можно перезапустить любой процесс при его закрытии
Как можно перезапустить процесс, если его закрыли, завершили? Например, на vbs я могу это сделать.

Какой командой можно перезапустить CMD c правами текущей учетной записи на удаленном ПК?
Здравствуйте. При использовании программы удаленного доступа, бат файлы запускаются в CMD с правами.

Yessenbek,
1) Ты можешь создать цикл при котором бот будет сам перезапускаться.
2) Также приколы с циклом, можно сделать цикл где наш любимый бот будет работать бесконечно.
3) Можешь создать аргумент при котором бот будет перезапускаться.

пример в коде, разве мне не нужно будет через терминал обратно запускать? Так то он выполняет комманды, но мне нужно чтобы он переапустился

while True: try: bot.polling(none_stop=True) except Exception as e: logger.error(e) # или import traceback; traceback.print_exc() Для печати полной информации time.sleep(15)

Эксперт Python

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

Куда можно задеплоить бота?
Доброго времени суток. Подскажите, пожалуйста, куда можно задеплоить бота на языке C#? Хочу.

Можно ли написать бота для MMORPG?
Уважаемые! Нужна ваша помощь. Сперва предисловие. Нашёл интересную MMORPG, и она, как и все игры.

Можно ли слегка обмануть Яндекс-бота?
Имеется почти не продвинутый в Яше сайт. На нем имеется большое количество графического контента по.

Как можно добавить бота в шашки?
Есть игра шашки, сделанная в Delphi, нужно как нибудь добавить бота. Помогите кто чем может. Вот.

Не работает код по уводу бота
Всем здрасте! Хочу сделать код по уводу бота. Но никак не получается.. Можете глянуть где.

Нужен код элементарного бота
Всем салам, нужен код py бота, который на все сообщения будет говорить привет, на VK API. Спасибо

Можно ли, и если можно то как перевести код SQL в код С#
КОД ПРОГРАММЫ void __fastcall TForm1::SKChange(TObject *Sender) //Выбор таблицы < .

Источник

Оцените статью