2012-11-29 6 views
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를 저장 피하려고했다 : 다음

내 시작 스크립트이다. 이것에 접근하는 더 좋은 방법이 있습니까? 다음과 같이 진행 할 수 있습니다, 당신은 rails s -p3002을 죽이고 싶은 경우에,

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

따라서 :

+0

많은 강력한 가능한, 성숙 기존 툴이를위한있다; 저는 개인적으로 영원히 사용합니다 : https://github.com/nodejitsu/forever – jrajav

+1

@ 키유라 말이 맞습니다. 이런 종류의 일을위한 도구. '블루 피트 (Bluepill)'는 떠오르는 생각이다. '.pid' 파일의 사용에 관해서는 무엇을 신뢰할 수 없습니까? – Faiz

+0

@Faiz 프로세스가 예기치 않게 종료되면 PID 파일이 정리되지 않습니다. – senfo

답변

0

최소의 추가 종속성을 유지하고 나에게 속하지 않는 레일스 인스턴스를 종료하지 않도록하려면 다음과 같이 끝내야합니다.

시작 스크립트

#!/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 
2

하나의 가능성은 맨 페이지에 따라서 설명하는 -f 스위치 pkill을 사용하는 것입니다

pkill -f 'rails s -p3002'