これは単純なはずだと思いますが、適切に機能させることができません。
これらは私がコマンドラインで実行できるコマンドです:
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
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でそのスクリプトが実行されます。
言い換えると、crossbar
がvenv-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がより適切なエラー処理を行うことができます。)