Uważam, że powinno to być proste, ale nie mogę sprawić, by działało poprawnie.
Oto polecenia, które mogę uruchomić w wierszu poleceń:
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
Te polecenia muszą być wykonane w tej kolejności. Ze względu na virtualenv, nie wykonywalny dla poprzeczki i później oddzielny skrypt Pythona, nie byłem w stanie znaleźć najlepszego sposobu, aby to uruchomić. Moja obecna praca w toku:
[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
źródło
źródło
Odpowiedzi:
To nie działa, ponieważ
source
jest polecenie powłoki, tak Systemd użytkownikaExecStart=
lubExecStartPre=
nie zrozumie je bezpośrednio ... (BTW, to samo odnosi się docd
a&&
).Można to osiągnąć, uruchamiając powłokę jawnie i uruchamiając wszystkie polecenia razem:
Ale lepszym podejściem jest zamiast pozyskiwania skryptu „aktywować” bezpośrednie użycie
python
pliku wykonywalnego wbin/
twoim virtualenv.Jeśli spojrzysz na dokument użytkowania virtualenv , zauważysz, że mówi:
Innymi słowy, zakładając, że
crossbar
skrypt Python, który chcesz uruchomić, wymagavenv-ap
virtualenv, po prostu zacznijcrossbar
od:I będzie automatycznie używać virtualenv przy każdym wywołaniu.
Możliwe jest również wywołanie interpretera Pythona bezpośrednio z virtualenv przy pomocy:
(Ponadto, jeśli chodzi o uruchamianie w określonym katalogu, ustawienie
WorkingDirectory=/home/debian/ap
jest lepsze niż użyciecd
polecenia. Nie potrzebujesz w ten sposób powłoki, a systemd może zrobić lepszą obsługę błędów.)źródło