Я считаю, что это должно быть просто, но я не могу заставить его работать должным образом.
Это команды, которые я могу запустить в командной строке:
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
systemd
python
python3
virtualenv
sscirrus
источник
источник
Ответы:
Это не работает, потому что
source
это команда оболочки, поэтому systemdExecStart=
илиExecStartPre=
не поймет их напрямую ... (Кстати, то же самое относитсяcd
и к&&
.)Этого можно добиться, запустив оболочку явно и выполнив все ваши команды вместе:
Но лучше вместо того, чтобы использовать сценарий «активации», напрямую использовать
python
исполняемый файлbin/
из вашего virtualenv.Если вы посмотрите документ использования virtualenv , вы заметите, что он говорит:
Другими словами, если предполагается
crossbar
, что скрипт Python, который вы хотите запустить и который требуетvenv-ap
virtualenv, просто начнитеcrossbar
с:И он будет автоматически использовать virtualenv при каждом вызове.
Также возможно, вызывая интерпретатор Python непосредственно из virtualenv, используя:
(Кроме того, что касается работы в определенном каталоге, настройка
WorkingDirectory=/home/debian/ap
лучше, чем использованиеcd
команды. Таким образом, вам не нужна оболочка, и systemd может лучше обрабатывать ошибки.)источник