Ich glaube, das sollte einfach sein, aber ich kann es nicht richtig zum Laufen bringen.
Dies sind die Befehle, die ich in der Befehlszeile ausführen kann:
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
Diese Befehle müssen in dieser Reihenfolge ausgeführt werden. Aufgrund der virtuellen Umgebung, der nicht ausführbaren Datei für Crossbar und des anschließenden separaten Python-Skripts konnte ich nicht herausfinden, wie dies am besten funktioniert. Meine aktuelle Arbeit in Arbeit:
[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
quelle
quelle
Antworten:
Dies funktioniert nicht, weil
source
es sich um einen Shell-Befehl handelt, also versteht systemd sie nichtExecStart=
oderExecStartPre=
versteht sie nicht direkt ... (Übrigens gilt das Gleiche fürcd
und&&
.)Sie können dies erreichen, indem Sie eine Shell explizit ausführen und dort alle Ihre Befehle zusammen ausführen:
Ein besserer Ansatz ist jedoch, anstatt das "Aktivierungs" -Skript zu verwenden, die
python
ausführbare Datei inbin/
Ihrer virtuellen Umgebung direkt zu verwenden.Wenn Sie sich das Nutzungsdokument von virtualenv ansehen , werden Sie feststellen, dass es lautet:
Mit anderen Worten, vorausgesetzt,
crossbar
Sie möchten das Python-Skript ausführen, für das dievenv-ap
virtuelle Umgebung erforderlich ist, beginnen Sie einfachcrossbar
mit:Bei jedem Aufruf wird automatisch die virtuelle Umgebung verwendet.
Es ist auch möglich, den Python-Interpreter direkt von der virtuellen Umgebung aus aufzurufen, mit:
(In Bezug auf die Ausführung in einem bestimmten Verzeichnis ist die Einstellung
WorkingDirectory=/home/debian/ap
besser als die Verwendung einescd
Befehls. Auf diese Weise benötigen Sie keine Shell, und systemd kann die Fehlerbehandlung für Sie verbessern.)quelle