Будем делать 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
Спасибо за внимание, опирался на перевод статьи отсюда.
Комментариев нет:
Отправить комментарий