Что будет, если бот, запущенный с помощью systemd, завершится с ошибкой?

Если бот, запущенный с помощью systemd, завершится с ошибкой, то дальнейшее поведение зависит от конфигурации юнита systemd, который управляет этим ботом. В частности, важны параметры Restart= и RestartSec= в файле юнита.

Основные параметры, которые влияют на поведение:

1. Restart=:

  • no (по умолчанию) — система не будет перезапускать процесс после его завершения.
  • on-success — перезапуск только при успешном завершении (с кодом 0).
  • on-failure — перезапуск при завершении с ненулевым кодом возврата или при аварийном завершении (например, segfault).
  • on-abnormal — перезапуск при аварийном завершении (например, сигнал SIGSEGV).
  • always — перезапуск всегда, независимо от причины завершения.
  • on-abort — перезапуск только при аварийном завершении.

2. RestartSec=:

  • Указывает задержку перед перезапуском (например, RestartSec=5s для задержки в 5 секунд).

3. StartLimitInterval= и StartLimitBurst=:

  • Эти параметры ограничивают количество перезапусков в определённый промежуток времени. Например, если указать StartLimitInterval=60s и StartLimitBurst=5, то systemd позволит не более 5 перезапусков за 60 секунд. Если лимит превышен, systemd прекратит попытки перезапуска.

Пример конфигурации юнита:


[Unit]
Description=My Bot Service
After=network.target

[Service]
ExecStart=/usr/bin/python3 /path/to/bot.py
Restart=on-failure
RestartSec=5s
User=botuser
Group=botgroup

[Install]
WantedBy=multi-user.target
    

Что произойдёт:

  • Если бот завершится с ошибкой, и в юните указано Restart=on-failure, то systemd попытается перезапустить его через указанное в RestartSec время.
  • Если перезапуски происходят слишком часто, и срабатывает ограничение StartLimitInterval/StartLimitBurst, systemd остановит попытки перезапуска и переведёт сервис в состояние failed.

Как проверить статус сервиса:

systemctl status my-bot-service

Эта команда покажет текущее состояние сервиса, количество перезапусков и причину последнего завершения.

Как посмотреть логи:

Логи сервиса можно просмотреть с помощью journalctl:

journalctl -u my-bot-service

Что делать, если сервис не перезапускается:

  1. Проверьте конфигурацию юнита (/etc/systemd/system/my-bot-service.service).
  2. Убедитесь, что параметр Restart= настроен правильно.
  3. Проверьте логи (journalctl -u my-bot-service) для диагностики ошибки.
  4. Если проблема в коде бота, исправьте её и перезапустите сервис:
sudo systemctl restart my-bot-service

Таким образом, поведение системы зависит от настроек systemd, и при правильной конфигурации бот может быть автоматически перезапущен после сбоя.