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

Здравствуйте! <br/> Можете подсказать, как правильно создать Unit для запуска сервиса в systemD? <br/> Я хочу запустить программу на Python в виртуальном окружении. Вот что я создал в файле: /etc/systemd/system/my_prog.service: <br/> <blockquote>[Unit]<br/>
Description=my_prog<br/>
After=network-online.target nss-user-lookup.target<br/>
[Service]<br/>
User=pi  # Имя пользователя, от имени которого будет запускаться команда в ExecStart<br/>
Group=pi<br/>
WorkingDirectory=/home/pi/www  # Директория, в которую будет осуществлён переход перед запуском<br/>
ExecStart=/home/pi/www/env/bin/python3 /home/pi/www/run.py<br/>
RestartSec=10<br/>
Restart=always  # Всегда перезапускать скрипт при его падениях<br/>
StandardOutput=journal<br/>
StandardError=journal<br/>
<br/>
[Install]<br/>
WantedBy=multi-user.target</blockquote> <br/> После этого я выполняю следующие команды: <br/> <blockquote>sudo systemctl daemon-reload<br/>
sudo systemctl enable --now my_prog.service<br/>
systemctl status my_prog.service</blockquote> <br/> Однако получаю ошибку: <br/> <blockquote>× my_prog.service - my_prog<br/>
     Loaded: loaded (/etc/systemd/system/my_prog.service; enabled; preset: enabled)<br/>
     Active: failed (Result: exit-code) since Thu 2024-09-19 12:48:53 MSK; 4s ago<br/>
   Duration: 22ms<br/>
    Process: 2598 ExecStart=/home/pi/www/env/bin/python3 /home/pi/www/run.py (code=exited, status=217/USER)<br/>
   Main PID: 2598 (code=exited, status=217/USER)<br/>
        CPU: 9ms</blockquote> <br/> Если же я запускаю команды вручную, то программа не работает из-за отсутствия пакета, хотя он установлен в виртуальном окружении. Я был бы признателен за вашу помощь! <br/> <blockquote>pi@server3:~$ c
  • 19 сентября 2024 г. 10:13
Ответы на вопрос 3
Здравствуйте! Ошибка, с которой вы сталкиваетесь (`status=217/USER`), указывает на проблему с правами доступа или контекстом пользователя.

### Решение проблемы с `USER`

1. **Проверьте, существует ли пользователь**: Убедитесь, что пользователь `pi`, от имени которого вы пытаетесь запустить сервис, действительно существует на вашей системе.

2. **Проверьте права доступа к виртуальному окружению**: Убедитесь, что у пользователя `pi` есть права доступа к каталогу вашего виртуального окружения и к скрипту. Для этого вы можете использовать следующие команды:

   ```bash
   ls -ld /home/pi/www/env
   ls -l /home/pi/www/run.py
   ```

   Убедитесь, что пользователь `pi` является владельцем или у него есть права на выполнение этих файлов.

3. **Обновите файл сервиса**: Добавьте опцию `Environment` для указания переменной окружения `PATH`, чтобы включить в нее путь к вашему виртуальному окружению. Это позволит гарантировать, что используемые библиотеки и пакеты доступны.

   Обновленный файл `/etc/systemd/system/my_prog.service` будет выглядеть так:

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

   [Service]
   User=pi
   Group=pi
   WorkingDirectory=/home/pi/www
   Environment="PATH=/home/pi/www/env/bin/:$PATH"
   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
   ```

4. **Перезагрузите системные демоны**: После внесения изменений в файл сервиса обязательно выполните следующую команду:

   ```bash
   sudo systemctl daemon-reload
   ```

5. **Активируйте сервис**: Если сервис уже был активирован, вы можете перезапустить его:

   ```bash
   sudo systemctl restart my_prog.service
   ```

6. **Проверьте статус**: После выполнения этих шагов проверьте статус сервиса:

   ```bash
   systemctl status my_prog.service
   ```

### Дополнительные советы

- Если программа по-прежнему не работает, старайтесь поймать логи для отладки. Вы можете просмотреть логи с помощью команды:

   ```bash
   journalctl -u my_prog.service -b
   ```

- Проверьте код вашего скрипта `run.py` на наличие ошибок. Убедитесь, что он работает в интерактивном режиме без ошибок.

Попробуйте следовать этим шагам, и, надеюсь, ваш сервис будет успешно запущен. Если возникнут дополнительные вопросы или ошибки, дайте знать!
Как-то так работает 
....
Environment=VIRTUAL_ENV=/home/leah/myapp/.venv
Environment=PYTHONPATH=/home/leah/myapp
ExecStart=/home/leah/myapp/.venv//bin/python /home/leah/myapp/run.py
....
Пропишите просто 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


Не забудьте перезагрузить конфигурацию
Похожие вопросы