Собираем linux systemd сервис из программы на Python


Будем делать systemd сервис из приложения на Питоне. Часто это необходимо, если вам нужно, чтобы при старте операционной системы (и сети) запускался ваш код на Python. 

Начнем с bash скрипта, который будет отвечать за старт и рестарт приложения.

Создадим файл python_app.sh с таким содержанием

#!/bin/bash

# Замените 'path_to_your_python_app' на путь к вашему python скрипту.
APP_PATH="/path/to/your/python/app.py"
PID_FILE="/var/run/python_app.pid"

# Перечислим функции, которые будут отвечать за запуск, рестар и остановку сервиса
start() {
    if [ -f $PID_FILE ]; then
        echo "The service is already running."
    else
        nohup python3 $APP_PATH &> /dev/null &
        echo $! > $PID_FILE
        echo "Service started."
    fi
}

stop() {
    if [ -f $PID_FILE ]; then
        kill $(cat $PID_FILE)
        rm $PID_FILE
        echo "Service stopped."
    else
        echo "The service is not running."
    fi
}

restart() {
    stop
    start
}

# Добавим условие: при запуске скрипта с параметром, он будет выполнять нужную функцию
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
esac
Делаем скрипт исполняемым
chmod +x python_app.sh
Мы можем проверить работу скрипта выполнив
./python_app.sh start
./python_app.sh stop
./python_app.sh restart
Далее создаем конфиг для Systemd сервиса
sudo nano /etc/systemd/system/python_app.service
с содержимым
[Unit]
Description=My Python Service
After=network.target

[Service]
Type=simple
User=username
WorkingDirectory=/path/to/your/python/app/directory
ExecStart=/path/to/your/python_app.sh start
ExecStop=/path/to/your/python_app.sh stop
ExecReload=/path/to/your/python_app.sh restart
Restart=always

[Install]
WantedBy=multi-user.target

Не забудьте изменить username, /path/to/your/python/app/directory и /path/to/your/python_app.sh на ваши актуальные пути. 

Description: Описание вашего сервиса
After: Указывает, что сервис должен запускаться после того, как поднимется сеть.
Type: Указывает тип процесса. Установите его в simple для простых долгосрочных процессов.
User: Пользователь, от имени которого будет выполняться сервис. Используйте подходящего пользователя с необходимыми правами.
WorkingDirectory: Директория, где расположено ваше приложение на Python. Убедитесь, что указан правильный путь.
ExecStart, ExecStop и ExecReload: Пути к вашему сервисному скрипту и соответствующим действиям (запуск, остановка и перезапуск).
Restart: Указывает, когда следует перезапускать сервис. В данном случае установлено значение always, чтобы сервис автоматически перезапускался в случае сбоя.
WantedBy: Указывает, к какой цели следует включить этот сервис. multi-user.target обеспечивает запуск сервиса в процессе загрузки системы. 

Далее мы активируем автозагрузку и запускам сервис

sudo systemctl enable python_app.service
sudo systemctl start python_app.service
Если вы не хотите использовать промежуточный bash скрипт, мы можем напрямую запускать Python программу из Systemd. Для этого, нужно немного изменить сервисный конфиг
[Unit]
Description=My Python App
After=network.target

[Service]
Type=simple
User=username
WorkingDirectory=/path/to/your/python/app/directory
ExecStart=/usr/bin/python3 /path/to/your/python/app.py
Restart=always

[Install]
WantedBy=multi-user.target
И также запустить сервис
sudo systemctl enable python_app.service
sudo systemctl start python_app.service
Спасибо за внимание, опирался на перевод статьи отсюда.

Комментариев нет:

Отправить комментарий