クラッシュした場合にウォッチドッグを使用してプロセスを再起動するプロセスを実行したいとします。そのために私は以下の設定ファイルと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
アレイが表示されないためですか?
どうすればこの作品を作成できますか?私はこのシグナルハンドラをテストのために行いました。ウォッチドッグプロセスを手動でクリーンアップするのは面倒です。