Автозапуск Python-скрипта с виртуальным окружением в systemd

Автозапуск Python-скриптов на Linux: настройка systemd

В данной статье мы рассмотрим, как настроить и запустить Python-скрипт, работающий в виртуальном окружении, в качестве системного сервиса.

Недавно вышла статья «Мониторинг интернет-соединения на Raspberry Pi: Python-скрипт для автоматических уведомлений по почте», в которой мы написали скрипт для мониторинга интернет-соединения. Однако, чтобы такой скрипт был по-настоящему полезен, его нужно запускать автоматически при загрузке системы и обеспечивать его непрерывную работу. В этой статье мы рассмотрим, как настроить наш Python-скрипт, работающий в виртуальном окружении, в качестве системного сервиса что позволит ему работать автономно и надежно.

Создание файла сервиса

Первым шагом является создание файла сервиса в системе. Для этого выполним следующую команду

Bash
sudo nano /etc/systemd/system/network_check.service

Настройка файла сервиса

Bash
[Unit]
Description=Network Check Service
After=network.target

[Service]
ExecStart=/home/user_name/Documents/env/bin/python3 /home/user_name/Documents/env/malina_online.py
Restart=on-failure
RestartSec=30
User=user_name
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target

Разберем ключевые параметры:

  • Description: Краткое описание сервиса.
  • After=network.target: Указывает, что сервис должен запускаться после запуска сетевых служб.
  • ExecStart: Путь к интерпретатору Python в виртуальном окружении и путь к вашему скрипту.
  • WorkingDirectory: Рабочая директория для запуска скрипта.
  • Restart: Указывает systemd перезапускать сервис в случае сбоя.
  • RestartSec: Время ожидания перед повторным запуском (в секундах).
  • User: Пользователь, от имени которого будет запущен сервис.
  • Environment: Устанавливает переменную окружения для вывода логов Python без буферизации.

Перезагрузка конфигурации systemd

После сохранения файла сервиса, необходимо перезагрузить конфигурацию systemd

Bash
sudo systemctl daemon-reload

Автозапуск сервиса

«Включаем» сервис, чтобы он автоматически запускался при загрузке системы

Bash
sudo systemctl enable network_check.service

Запуск сервиса

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

Bash
sudo systemctl start network_check.service

Проверка статуса сервиса

Чтобы убедиться, что сервис успешно запущен, выполним

Bash
sudo systemctl status network_check.service