Как запустить команду внутри 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
sscirrus
источник
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будет выполняться под 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 может лучше обрабатывать ошибки.)

filbranden
источник