Як запустити команду всередині virtualenv за допомогою systemd


15

Я вважаю, що це повинно бути простим, але я не можу змусити його працювати належним чином.

Це команди, які я можу виконати в командному рядку:

cd /home/debian/ap

# Start a virtualenv
source venv-ap/bin/activate

# This needs to happen inside the virtualenv and takes ~20 seconds
crossbar start

# Outside the virtualenv, perhaps in a different command line window
python3 /home/debian/myscript.py

Ці команди мають бути виконані в такому порядку. Через virtualenv, невиконаного для перекладини та окремого сценарію python, я не зміг знайти найкращий спосіб змусити це працювати. Моя поточна незавершена робота:

[Unit]
Description=Start CB
After=network.target

[Service]
Type=simple
User=debian
ExecStartPre=source /home/debian/ap/venv-ap/bin/activate
ExecStart=cd /home/debian/ap/ && crossbar start
Restart=always

[Install]
WantedBy=multi-user.target

1
Чи можете ви це ще вирішити? Якщо так, то як?
чорний

Відповіді:


11

Це не працює , тому що sourceце команда оболонки, тому Systemd - х ExecStart=або ExecStartPre=не розуміти їх безпосередньо ... (До речі, те ж саме вірно для cdі &&.)

Ви можете домогтися цього, запустивши оболонку явно і запустивши всі свої команди разом:

ExecStart=/bin/sh -c 'cd /home/debian/ap/ && source venv-ap/bin/activate && crossbar start'

Але кращий підхід полягає в тому, щоб замість джерела сценарію "активувати" безпосередньо використовувати pythonвиконуваний файл у bin/вашому virtualenv.

Якщо ви подивитесь на документ про використання virtualenv , ви помітите, що він говорить:

ENV/binстворено, де живуть виконувані файли - помітно новий пітон . Таким чином, запуск сценарію з #! /path/to/ENV/bin/pythonзапускав би цей скрипт під пітоном цього virtualenv.

Іншими словами, якщо припустити crossbar, що сценарій Python, який ви хочете запустити, вимагає venv-apvirtualenv, просто почніть crossbarз:

#!/home/debian/ap/venv-ap/bin/python

І він автоматично використовуватиме virtualenv, коли буде викликано.

Також можливо, звертаючись до викладача Python від virtualenv безпосередньо, за допомогою:

ExecStart=/home/debian/ap/venv-ap/bin/python /path/to/crossbar start

(Крім того, що стосується запуску в певному каталозі, налаштування WorkingDirectory=/home/debian/apкраще, ніж використання cdкоманди. Вам не потрібна оболонка, і systemd може зробити для вас краще обробку помилок.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.