0

Rails サーバーで同時に実行したい 3 つのアプリがあり、1 つの場所からすべてのサーバーを強制終了するオプションも必要です。

私は Bash の経験があまりないので、特定のアプリのサーバーを起動するためにどのコマンドを使用すればよいかわかりません。スクリプトは app ディレクトリにないため、単純な rails s は機能しません。

そこから、3 つのサーバーが実行されているプロセスの PID を収集できれば、スクリプトでユーザー入力を求めるプロンプトを表示し、何かが入力されるたびに 3 つのプロセスを強制終了できると思います。PIDを取得する方法がわかりません。

さらに、各アプリにはいくつかの環境変数があり、アプリの構成ファイルで割り当てられた値とは異なる値を設定したいと考えています。以前は、rails s の前に export var=value を使用していましたが、個別の各プロセスが適切な変数を取得していることを保証する方法がわかりません。

どんな助けでも大歓迎です!

4

5 に答える 5

2

スクリプト

次のようなことを試すことができます。

#!/bin/bash

case "$1" in
  start)
    pushd app/directory
    (export FOO=bar; rails s ...; echo $! > pid1)
    (export FOO=bar; rails s ...; echo $! > pid2)
    (export FOO=bar; rails s ...; echo $! > pid3)
    popd
    ;;

  stop)
    kill $(cat pid1)
    kill $(cat pid2)
    kill $(cat pid3)
    rm pid1 pid2 pid3
    ;;

  *)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
esac

exit 0

このスクリプトをscript.shやなどのファイルに保存しますchmod +x script.sh。でサーバーを起動./script.sh startし、. ですべてのサーバーを強制終了できます./script.sh stop。サーバーを起動する 3 行にすべての詳細を入力する必要があります。

説明

最初はpushd: これにより、ディレクトリがアプリの場所に変更されます。3 つの起動行のpopd後、スクリプトが存在する場所に戻ります。を囲む括弧(export blah blah)はサブシェルを作成するため、 を介して括弧内に設定した環境変数はexport括弧の外側に存在してはなりません。さらに、3 つのアプリが異なるディレクトリにある場合はcd、3 つの括弧のそれぞれに を入れて、. の前にあるアプリのディレクトリに移動できrails sます。行は次のようになりますexport FOO=bar; cd app1/directory; rails s ...; echo $! > pid1。コマンドの後のセミコロンを忘れないでくださいcd! この場合、pushdpopd行を削除することもできます。

Bash では$!、最後のコマンドのプロセス ID です。それをエコーし​​、(を使用して) (またはまたは)>という名前のファイルにリダイレクトします。後で、サーバーを強制終了したい場合は、 を実行します。はコマンドを実行し、出力をインラインで返します。pid ファイルにはプロセス ID のみが含まれているため、 はプロセス ID 番号を返すだけで、それが に渡されます。サーバーを強制終了した後、pid ファイルも削除します。pid1pid2pid3kill $(cat pid1)$(...)cat pid1kill

免責事項

このスクリプトは、エラー チェックと構成に関してもう少し作業が必要になる可能性があり、まだテストしていませんが、動作するはずです。少なくとも、独自のスクリプトを作成するための良い出発点になるはずです。

追加情報

私のお気に入りの bash リソースはAdvanced Bash-Scripting Guideです。実際、bash はいくつかの優れた機能を備えたかなり強力な言語です。bash の仕組みを学ぶことをお勧めします。

于 2013-10-03T01:29:16.813 に答える
1

複数のリモート マシンで SSH 経由でコマンドを並列実行するためのフレームワークである capistrano を試してみませんか。これを行うためのレシピがたくさんあります。

于 2013-10-03T00:11:08.797 に答える
0

サーバーを手動でスピンアップしてシャットダウンするよりも、必要に応じて各サーバーを実行するpow.cxを設定する方がよいでしょう。

于 2013-10-03T01:30:04.917 に答える
0

Foremanを使用して、プロセスを実行、監視、および管理できます。

于 2013-10-03T02:57:45.023 に答える