2017-05-23 19 views
0

クラッシュした場合にウォッチドッグを使用してプロセスを再起動するプロセスを実行したいとします。そのために私は以下の設定ファイルとprocess.shを持っています:シェルスクリプトでサブプロセスを終了する

$ cat process.sh 
#!/bin/bash 

sleep $1; 
exit -1 

$ cat processes.cfg 
slow:./process.sh 5 
fast:./process.sh 3 

次のスクリプトはprocess.cfgを読み込み、process.shを使ってサブプロセスを開始します。私は私が期待するよう今

https://serverfault.com/questions/52976/simple-way-of-restarting-crashed-processes

#!/bin/bash 

wtch() { 

    until eval "$1" ; do 
    echo "server '$2' crashed with exit code $? . respawning ..." >&2 
    sleep 1 
    done 
} 

cleanup() { 

    echo killing subprocesses ... 

    for i in "${!subproc[@]}" 
    do 
    echo killing ${subproc[$i]} 
    kill -9 ${subproc[$i]} 
    done 

    echo exiting ... 
    exit -1 
} 

declare -A subproc 

cat processes.cfg | while IFS=: read name command 
do 
    echo "$command" "$name" 
    wtch "$command" "$name" & 
    subproc[$name]=$! 
    echo $! 
done 

trap cleanup SIGINT 

while true; do 
    sleep 10; 
done 

を以下、Ctrl-Cキーを押すことは、サブプロセスを殺さないことを書きました。何らかの理由で、cleanup関数はサブプロ配列内に何も見つかりません。

これはシグナルハンドラにsubprocアレイが表示されないためですか?

どうすればこの作品を作成できますか?私はこのシグナルハンドラをテストのために行いました。ウォッチドッグプロセスを手動でクリーンアップするのは面倒です。

答えて

1

これは、お客様のsubprocのサブシェルサブシェル内での変更がpiping into a while loopによって行われたためです。代わりにwhile […] done < processes.cfgを実行して、whileループを同じシェル内に保つことができます。

関連する問題