web-dev-qa-db-ja.com

スクリプトを直接呼び出すのではなく、なぜスーパーバイザーで `bash -c`を使用するのですか?

サーバーのサービスを制御するためにsupervisordを使い始めています。私はLinuxのプロユーザーではありませんが、Linuxをうまく使いこなすことができます。

ちょうど好奇心から、supervisordのほとんどのコマンドが次のように呼び出されているように見えることに気づきました:

[program:install]
command=bash -c "/src/etc/install.sh"

私はbashの人を読み、-cを使用して、文字列の後に渡される変数を挿入する必要があることを知っています。

では、スクリプトを直接呼び出すのではなく(下の例のように)、スーパーバイザー(またはその他の場所)でbash -cを使用するポイントは何ですか?

[program:install]
command=/src/etc/install.sh

ありがとう!

11
Daniel Costa

パス名展開(*?)、コマンドリスト(;&&||)、リダイレクト(<>|、)は、コマンドを引数文字列の配列に分割するだけの監視プログラムでは実装されていません。

bash -cは、コマンドでそのような機能を使用したくなるかもしれない初心者ユーザーのための単なる助けになるかもしれません。たとえば、それは驚きを避けます

command=echo foo > /tmp/bar

foofoo > /tmp/barに書き込む代わりに/tmp/barを出力します。

-cは変数とはほとんど関係がありません。 bashへの追加の引数は、コマンドのスクリプト引数$0$1などとしてのみ使用できますが、その機能はほとんど使用されません。たとえば、bash -c 'echo $0 $0' foofoo fooを出力します。

11
Marko Kohtala

説明されています ドキュメント内

サブプロセスの実行時に監視プログラムによってシェルが実行されることはないため、USER、PATH、HOME、Shell、LOGNAMEなどの環境変数がデフォルトから変更されたり、その他の方法で再割り当てされたりすることはありません。これは、構成でuser =スタンザを使用してスーパーバイザー実行からプログラムをrootとして実行している場合に特に重要です。

この問題を回避するにはbash -cを使用できます。

6
Mark Wagner