Как правильно создать Unit для запуска сервиса в systemD?
Мне нужно запустить программу на Python, но в виртуальном окружении.
Создаю файл: /etc/systemd/system/my_prog.service:
[Unit]
Description=my_prog
After=network-online.target nss-user-lookup.target
[Service]
User=pi # Имя пользователя, от имени которого будет запускаться команда, указанная в ExecStart
Group=pi
WorkingDirectory=/home/pi/www # Директория, в которую будет осуществлён переход перед запуском
ExecStart=/home/pi/www/env/bin/python3 /home/pi/www/run.py
RestartSec=10
Restart=always # Всегда перезапускать скрипт при его падениях
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Потом я запускаю последовательно команды:
sudo systemctl daemon-reload
sudo systemctl enable --now my_prog.service
systemctl status my_prog.service
И получаю ошибку:
× my_prog.service - my_prog
Loaded: loaded (/etc/systemd/system/my_prog.service; enabled; preset: enabled)
Active: failed (Result: exit-code) since Thu 2024-09-19 12:48:53 MSK; 4s ago
Duration: 22ms
Process: 2598 ExecStart=/home/pi/www/env/bin/python3 /home/pi/www/run.py (code=exited, status=217/USER)
Main PID: 2598 (code=exited, status=217/USER)
CPU: 9ms
Если же я вручную пройдусь по командам этого файла systemD, то моя программа тоже не работает из-за отсутствия пакета. Хотя этот пакет установлен в виртуальном окружении.
pi@server3:~$ cd /home/pi/www
pi@server3:~/www$ /home/pi/www/env/bin/python3 /home/pi/www/run.py
Traceback (most recent call last):
File "/home/pi/www/run.py", line 3, in <module>
import mysql.connector as db
pi@server3:~/www$
При этом моя программа работает нормально если я вручную запускаю виртуальное окружение:
pi@server3:~$ cd www
pi@server3:~/www$ source env/bin/activate
(env) pi@server3:~/www$ python run.py
78.10.222.186 - - [19/Sep/2024 12:58:11] "GET /run.py HTTP/1.1" 200
Что я делаю не так?
И как в systemD запустить программу на Python в виртуальном окружении?