Бот «не работает» на сервере двумя способами. Очевидный: останавливается, как только вы закрываете SSH. Коварный: работает себе два дня, падает в 4 утра на каком-то необработанном исключении, и вы узнаёте об этом через часы, когда кто-то спрашивает, почему он лежит. У обоих одно решение, и это не «не забывать перезапускать» — это передать работу systemd, который держит всё живым за вас.
Почему умирает при выходе
Если запустили python bot.py в SSH-сессии, процесс — её потомок. Закрыли сессию — процесс с ней. nohup и & маскируют это, но не дают ни рестарта при падении, ни старта при загрузке — так вы решили мелкую проблему и сохранили большую.
Реальное решение: systemd-сервис
Это всё целиком. Создайте /etc/systemd/system/mybot.service:
[Unit]
Description=My bot
After=network-online.target
[Service]
WorkingDirectory=/home/youruser/mybot
ExecStart=/home/youruser/mybot/venv/bin/python bot.py
Restart=always
RestartSec=5
User=youruser
Environment=API_KEY=...
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
Всю тяжёлую работу делают две строки:
Restart=always— бот упал, systemd поднимает за 5 секунд. Та самая смерть в 4 утра становится 5-секундным морганием, которого никто не замечает.enable— стартует после перезагрузки сам. Без «о, сервер перезагрузился, а я забыл всё перезапустить».
Если всё ещё барахлит — читайте логи
Бот, который крэш-лупит, не чинится «перезапустить сильнее»; что-то реально не так. systemd ловит stdout/stderr, так что:
systemctl status mybot # жив/лежит, последний код выхода
journalctl -u mybot -n 100 # свежие логи + ошибка, на которой умер
journalctl -u mybot -f # следить вживую
Причина почти всегда прямо там: отсутствующая переменная окружения, необработанное исключение, таймаут API, OOM-kill. Чините её — Restart=always это страховка, не лекарство от реального бага.
Подсказка: если логи показывают, что бота убивают за память — вы переросли сервер, см. гайд по sizing.
Когда вместо подходят tmux или pm2
systemd не единственный ответ, просто лучший дефолт:
- tmux — отлично для быстрого теста или наблюдения за интерактивным процессом. Запустил, отсоединился, вернулся. Но не перезапустит при падении и не переживёт перезагрузку — не для прода.
- pm2 — разумен, если уже в мире Node и хотите его дашборд процессов. Загвоздка: pm2 сам процесс, который теперь надо держать живым (обычно... через systemd). Для одного бота это лишний слой.
Для одного постоянного бота или агента systemd — самое простое, что реально работает: он уже на сервере, не требует лишних инструментов и делает рестарт, старт-при-загрузке и логирование из коробки.
Честный итог
Аптайм — не про сервер побольше или больше дисциплины, а про то, чтобы не привязывать процесс к ноутбуку. Оберните в systemd-юнит с Restart=always и enable, и смотрите journalctl, когда что-то не так. Сделайте это раз — и бот держится, смотрите вы или спите. (Новый сервер? Сначала закройте его — бот 24/7 это и мишень 24/7.)