Здравствуйте! <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
Здравствуйте! Ошибка, с которой вы сталкиваетесь (`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
Не забудьте перезагрузить конфигурацию