以下は私のsupervisor.conf
。
[supervisord]
nodaemon=true
[program:daphne]
command=source "/opt/ros/Indigo/setup.sh" && daphne -b 0.0.0.0 -p 8000 robot_configuration_interface.asgi:channel_layer
[program:worker]
environment=Django_SETTINGS_MODULE="robot_configuration_interface.settings"
command= source "/opt/ros/Indigo/setup.bash" && Django-admin runworker
これは私が得るエラーです:
INFO spawnerr:コマンド「ソース」が見つかりません
Bashにコマンドソースがあるべきではありません。これがsh
を使用している場合、どのようにしてbashを強制的に実行できますか?
スーパーバイザーは、bash
またはsh
のいずれかで、シェルをまったく開始しません。したがって、Shell-builtinが見つからないのは当然です。コマンド。必要な場合は、自分で開始する必要があります。したがって:
command=/bin/bash -c 'source "$0" && exec "$@"' /opt/ros/Indigo/setup.sh daphne -b 0.0.0.0 -p 8000 robot_configuration_interface.asgi:channel_layer
そして
command=/bin/bash -c 'source "$0" && exec "$@"' /opt/ros/Indigo/setup.bash Django-admin runworker
どちらの場合も、exec
は、プロセスが終了するのを待つだけのシェルインスタンスを残すのではなく、メモリ内で実行中のプロセスに置き換えるようにシェルに指示するために存在します。
bash -c
の後の最初の引数は$0
に配置され、その後の引数は$1
以降に配置されます。したがって、"$0"
をソースし、"$@"
を実行して、最初のそのような引数を参照し、次に同じ引数を参照することができます。
から ドキュメント :
サブプロセスの実行時にsupervisordによってシェルが実行されないため、USER、PATH、HOME、Shell、LOGNAMEなどの環境変数は変更されませんデフォルトから、またはその他の方法で再割り当てされます。
したがって、シェル操作(&&
を含む)も同様に、トップレベルで使用できるとは期待できません。
私もこの問題に遭遇します。
そして、私はより良い解決策を見つけました。
source ~/.bash_profile
を使用する方が良いかもしれません。
[program: dapi]
user=pyer
command=/bin/bash -c 'source ~/.bash_profile && /usr/local/python3.6/bin/pipenv run python manage.py'
directory=/data/prd/tools/dapi
autostart=true
startretries=1
stopasgroup=true
スーパーバイザーが作成したサブプロセスによって開始されたプロセスの場合は、次を参照できます。 http://supervisord.org/subprocess.html#pidproxy-program