Задать вопрос

Как сделать автозапуск python программы с виртуальным окружением в фоновом режиме на линукс?

Есть программа на python, которая использует много модулей из виртуального окружения.
Делал все по этому гайду https://losst.pro/avtozagruzka-linux?ysclid=lofmx5...
Из раздела автозагрузка скриптов в Linux
Мой скрипт
#!/bin/bash 
source /home/user/program/venv/bin/activate
sudo python3 /home/user/program//webui.py


Я очень плохо разбираюсь в скриптах линукс, прошу понять и простить)
  • Вопрос задан
  • 2600 просмотров
Подписаться 5 Простой Комментировать
Решения вопроса 4
drygdryg
@drygdryg
Python-разработчик
Можно использовать систему инициализации Systemd. Напишите unit-файл такого вида:
[Unit]
Description=My Script Service
After=multi-user.target

[Service]
User=user  # Имя пользователя, от имени которого будет запускаться команда, указанная в ExecStart
WorkingDirectory=/home/user/program  # Директория, в которую будет осуществлён переход перед запуском
ExecStart=/home/user/program/venv/bin/python /home/user/program/webui.py
Restart=always  # Всегда перезапускать скрипт при его падениях

[Install]
WantedBy=multi-user.target

и сохраните его в директории /etc/systemd/system с расширением .service, например, /etc/systemd/system/my_program.service.

Здесь не используется скрипт activate для активации виртуального окружения, но вместо этого указывается полный путь к интерпретатору Python внутри этого виртуального окружения.
Также важно указывать абсолютные пути к файлам и директориям, даже несмотря на то, что задана рабочая директория WorkingDirectory.
Если ваш скрипт опирается на сетевые соединение, в секции Unit в качестве After задайте network-online.target вместо multi-user.target:
After=network-online.target

После этого перезагрузите конфигурацию Systemd:
sudo systemctl daemon-reload
И запустите сервис с добавлением в автозагрузку:
sudo systemctl enable --now my_program.service
Ответ написан
smorman
@smorman
When In Rome do as The Romans do...
Я пользую Supervisor для этих целей, помимо Systemd.

Конфиг-юнит your_config.conf в папку:
- если в Ubuntu, то
/etc/supervisor/conf.d/
- если в Arch Linux, то
/etc/supervisord/conf.d/
такого содержания:
; supervisor config file

[program:01-HTTPAceProxy]
user = user # - Если программа лежит в папке Пользователя
command = bash -c "sleep 5 && /usr/bin/python3 /opt/your_py_programm/your_py_programm.py"
или
command = bash -c "sleep 5 && /home/user/venv/bin/python3 /home/user/your_py_programm/your_py_programm.py" # - Если программа лежит в папке Пользователя
stdout_logfile_maxbytes = 50MB
stdout_logfile = /var/log/your_config.log
stderr_logfile = /var/log/your_config.log
startsecs = 10
priority = 1
stopasgroup = true
autostart = true
autorestart = true

Потом выполнить:
sudo supervisorctl reread
sudo supervisorctl update
sudo systemctl restart supervisor.service # - для Ubuntu
sudo systemctl restart supervisord.service # - для Arch Linux

Состояние смотреть в веб-морде:
http://localhost:9001/
Ответ написан
Комментировать
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
Если инит - systemd - пишете юнит для него, он запустит.
Если инит - sysv, пишете стартовый скрипт для того, что у Вас там - openrc, upstart, rc.local...
Ответ написан
Комментировать
Griboks
@Griboks
Рекомендую использовать Systemd. Но, разумеется, впадлу разбираться в этих ваших линуксах. Поэтому crontab -e и туда дописываете @reboot /path/to/my/script.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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