1

我编写了一个 bash 脚本,它启动了许多不同的小部件(各种 Rails 应用程序)并在后台运行它们。我现在正在尝试编写一个恭维停止脚本来杀死由该启动脚本启动的每个进程,但我不确定处理它的最佳方法。

以下是我的启动脚本:

#!/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 文件中,因为它们非常不可靠。有没有更好的方法来解决这个问题?

4

2 回答 2

2

一种可能性是使用手册页中描述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 回答