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


15

これは単純なはずですが、適切に機能させることができません。

これらは私がコマンドラインで実行できるコマンドです:

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
もう解けますか?もしそうなら、どうですか?

回答:


11

これは仕事をしないsource、シェルコマンドであるので、のにsystemd ExecStart=またはExecStartPre=直接それらを理解することはありません...(ところで、同じことが当てはまりあるcd&&。)

あなたは可能性が明示的にシェルを実行しているし、そこに一緒にすべてのあなたのコマンドを実行して、それを達成します。

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

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

virtualenvの使用法ドキュメントを見ると、次のように書かれていることがわかります。

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

言い換えれば、virtualenv crossbarを必要とする実行したいPythonスクリプトであると仮定venv-apするcrossbarと、単に次のように始まります:

#!/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がより適切なエラー処理を行うことができます。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.