Vova316
@Vova316

Как в systemD запустить программу на Python в виртуальном окружении?

Как правильно создать 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 в виртуальном окружении?
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ответы на вопрос 2
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Как-то так работает
....
Environment=VIRTUAL_ENV=/home/leah/myapp/.venv
Environment=PYTHONPATH=/home/leah/myapp
ExecStart=/home/leah/myapp/.venv//bin/python /home/leah/myapp/run.py
....
Ответ написан
grantur5707
@grantur5707
Full Stack Web Developer
Пропишите просто Environment для активации виртуального окружения в вашем юнит файле:

[Unit]
Description=my_prog
After=network-online.target nss-user-lookup.target

[Service]
User=pi
Group=pi
WorkingDirectory=/home/pi/www
ExecStart=/home/pi/www/env/bin/python3 /home/pi/www/run.py
Environment="PATH=/home/pi/www/env/bin:/usr/bin:/bin"
RestartSec=10
Restart=always
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target


Не забудьте перезагрузить конфигурацию
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы