1

さまざまなウィジェット(さまざまなRailsアプリケーション)を起動してバックグラウンドで実行するbashスクリプトを作成しました。私は今、その開始スクリプトによって開始された各プロセスを強制終了する補完的な停止スクリプトを作成しようとしていますが、それにアプローチするための最良の方法がわかりません。

以下は私の開始スクリプトです。

#!/bin/bash

widgets=( widget1 widget2 widget3 ) # Specifies, in order, which widgets to load
port=3000
basePath=$("pwd")

for dir in "${widgets[@]}"
do
  cd ${basePath}/widgets/$dir
  echo "Starting ${dir} widget."
  rails s -p$port &
  port=$((port+1))
done

可能であれば、PIDの信頼性が非常に低いため、PIDを.pidファイルに保存しないようにしました。これにアプローチするためのより良い方法はありますか?

4

2 に答える 2

2

1つの可能性は、manページでこのように説明されているスイッチで使用pkillすることです。-f

-f     The pattern is normally only matched against the process name.  When -f is set, the full command line is used.

したがって、殺したい場合はrails s -p3002、次のように進めることができます。

pkill -f 'rails s -p3002'
于 2012-11-29T16:19:57.587 に答える
0

余分な依存関係を最小限に抑え、自分に属していないrailsインスタンスをシャットダウンしないようにするために、最終的に次のようになりました。

スクリプトを開始

#!/bin/bash

widgets=( widget1 widget2 widget3 ) # Specifies, in order, which widgets to load
port=3000
basePath=$("pwd")
pidFile="${basePath}/pids.pid"

if [ -f $pidFile ];
then
  echo "$pidFile already exists. Stop the process before attempting to start."
else
  echo -n "" > $pidFile

  for dir in "${widgets[@]}"
  do
    cd ${basePath}/widgets/$dir
    echo "Starting ${dir} widget."
    rails s -p$port &
    echo -n "$! " >> $pidFile
    port=$((port+1))
  done
fi

スクリプトを停止する

#!/bin/bash

pidFile='pids.pid'

if [ -f $pidFile ];
then
  pids=`cat ${pidFile}`

  for pid in "${pids[@]}"
  do
    kill $pid
  done

  rm $pidFile
else
  echo "Process file wasn't found. Aborting..."
fi
于 2012-11-29T16:39:55.693 に答える