systemdを使用してvirtualenvでコマンドを実行する方法

systemdを使用してvirtualenvでコマンドを実行する方法

私はこれが簡単なはずだと思いますが、それを機能させることはできません。

コマンドラインから実行できるコマンドは次のとおりです。

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

ベストアンサー1

sourceこれはシェルコマンドなので動作しないので、systemd or ExecStart=notExecStartPre=は直接理解するでしょうcd...&&

あなたできるシェルを明示的に実行し、そこからすべてのコマンドを一緒に実行してこれを実行します。

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

pythonしかし、より良い方法は、「アクティブ化」スクリプトを取得する代わりにvirtualenvで直接実行可能ファイルを使用することです。bin/

virtualenvを見るとファイル操作、次の内容が表示されます。

ENV/bin実行可能ファイルがある場所に作成されます。明らかに新しい実行可能ファイルです。Python。したがって、スクリプトを実行すると、#! /path/to/ENV/bin/pythonそのvirtualenvのPythonでスクリプトが実行されます。

つまり、crossbar実行したいPythonスクリプトにvirtualenvが必要であると仮定すると、venv-apcrossbarのように起動します。

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

呼び出されるたびに自動的にvirtualenvを使用します。

次の手順を実行して、virtualenvから直接Pythonインタプリタを呼び出すこともできます。

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

(また、特定のディレクトリで実行している場合は、コマンドを使用するWorkingDirectory=/home/debian/apよりも設定することをお勧めしますcd。これにより、シェルは不要になり、systemdはより良いエラー処理を実行できます。)

おすすめ記事