So führen Sie einen Befehl in einer virtuellen Umgebung mit systemd aus

15

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
sscirrus
quelle
1
Könnten Sie es noch lösen? Wenn das so ist, wie?
schwarz

Antworten:

11

Dies funktioniert nicht, weil sourcees sich um einen Shell-Befehl handelt, also versteht systemd sie nicht ExecStart=oder ExecStartPre=versteht sie nicht direkt ... (Übrigens gilt das Gleiche für cdund &&.)

Sie können dies erreichen, indem Sie eine Shell explizit ausführen und dort alle Ihre Befehle zusammen ausführen:

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

Ein besserer Ansatz ist jedoch, anstatt das "Aktivierungs" -Skript zu verwenden, die pythonausführbare Datei in bin/Ihrer virtuellen Umgebung direkt zu verwenden.

Wenn Sie sich das Nutzungsdokument von virtualenv ansehen , werden Sie feststellen, dass es lautet:

ENV/binwird erstellt, wo ausführbare Dateien leben - spürbar eine neue Python . Wenn Sie also ein Skript mit #! /path/to/ENV/bin/pythonausführen, wird dieses Skript unter dem Python dieser virtuellen Umgebung ausgeführt.

Mit anderen Worten, vorausgesetzt, crossbarSie möchten das Python-Skript ausführen, für das die venv-apvirtuelle Umgebung erforderlich ist, beginnen Sie einfach crossbarmit:

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

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:

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

(In Bezug auf die Ausführung in einem bestimmten Verzeichnis ist die Einstellung WorkingDirectory=/home/debian/apbesser als die Verwendung eines cdBefehls. Auf diese Weise benötigen Sie keine Shell, und systemd kann die Fehlerbehandlung für Sie verbessern.)

filbranden
quelle