web-dev-qa-db-ja.com

スーパーバイザーがコマンドソースを見つけられないのはなぜですか

以下は私の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を強制的に実行できますか?

9
cjds

スーパーバイザーは、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などの環境変数は変更されませんデフォルトから、またはその他の方法で再割り当てされます。

したがって、シェル操作(&&を含む)も同様に、トップレベルで使用できるとは期待できません。

13
Charles Duffy

私もこの問題に遭遇します。

そして、私はより良い解決策を見つけました。

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

1
Jian Dai