@nemolayn
Создатель бота Nemo

Как перезапустить бота через команду на Windows?

Мне нужно создать команду которая бы перезапускала бота:
@router.message(Command(commands=["restart", "pl"]))
async def restart(message: Message):
    ...

На linux все было бы слишком просто:
import subprocess
@router.message(Command(commands=["restart", "pl"]))
async def restart(message: Message):
    subprocess.call(["sudo", "systemctl", "restart", "main-bot"])
    await message.answer("Выполняю...")


Понятия не имею как сделать это на Windows. Заранее спасибо за ответ.
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Увы, под виндой достучаться до менеджера служб куда сложнее.
Вариант А: оформить бота как службу через утилиту вроде NSSM.
Тогда для перезапуска можно попробовать выполнить
cmd.exe /C "net stop имя_твоей_службы && net start имя_твоей_службы"

Ну или закинуть эту строку в cmd-файл и запускать уже его. Но поскольку подкоманды restart нет, то я не знаю, доживёт ли твой скрипт до выполнения net start.
Вариант А2: то же самое, но использовать ctypes для обращения к Service Control Manager через WinAPI. Сразу скажу, это сложнее.

Вариант Б: Очень примитивный, но корявый способ - завернуть запуск бота в батник(cmd-файл), где запускать бота в вечном цикле с ожиданием, и перезапускать его, если бот завершился с ненулевым кодом завершения.
Что-то типа
:restart
python bot.py
IF ERRORLEVEL 1 GOTO restart

ERRORLEVEL проверяет, что код завершения больше или равен указанному.
Тогда, если надо завершить работу бота, делаешь sys.exit(0), а для перезапуска sys.exit(1). Бонус: бот также перезапустится при непойманном исключении.

Вариант В: Запустить скрипт бота напрямую, скажем, через os.startfile(sys.argv[0]), и сразу же выйти самому. Но приведённый вариант не дружит с виртуальным окружением, так что может потребоваться модификация вроде
os.startfile('/path/to/venv/python3', 'open', sys.argv[0])
. Если нужно ещё и параметры командной строки передать, дело усложняется.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час
21 нояб. 2024, в 21:42
100000 руб./за проект