web-dev-qa-db-ja.com

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
15
sscirrus

sourceはシェルコマンドであるため、これは機能しません。systemdのExecStart=またはExecStartPre=は、それらを直接理解できません...(BTW、同じことがcdおよび&&。)

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

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

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

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

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

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

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

そして、呼び出されると自動的にvirtualenvを使用します。

Pythonインタプリタをvirtualenvから直接呼び出すことも可能です:

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

(また、特定のディレクトリでの実行に関しては、WorkingDirectory=/home/debian/apを設定することはcdコマンドを使用するよりも優れています。そのようにシェルを必要とせず、systemdがより適切なエラー処理を行うことができます。)

11
filbranden