私はこれが簡単なはずだと思いますが、それを機能させることはできません。
コマンドラインから実行できるコマンドは次のとおりです。
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-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はより良いエラー処理を実行できます。)