シェルスクリプトで、次の操作を行います。
#!/bin/sh
while true; do <some application>; sleep 1; done &
... rest of the scrip ...
これはスクリプトの残りの部分に必要なものであり、アプリケーションが常に実行されることを保証します。しかし、スクリプトは弾力性があるため、アプリケーションが実行されておらず、誤って応答しているように見えない場合は、後でもう一度やり直してください。
SIGTERM
たとえば、またはによってデフォルトのスクリプトが終了した場合は、このループも停止したいとSIGINT
思います。while
基本スクリプトが終了した後もアプリケーションを実行する必要はありません。
シェルスクリプトでこれを行う一般的な方法は何ですか?私が望むものは2つあります。
- アプリケーションの再実行防止
- 現在実行中のアプリケーションインスタンスをできるだけ早く停止してください。
シェルスクリプトでこれを行う方法がわかりません。INT
andをキャプチャできますが、ループにロジックを挿入する方法とアプリケーションを停止する方法がTERM
わかりません。while
現在一般で作業していますが、必要に応じてsh
続行できます。bash
ベストアンサー1
スクリプトで望むのは、無限ループではなくロックされたファイルです。
次に、ラッパースクリプトでアクションを実行するスクリプトを呼び出します。
#!/bin/sh
if [ -f /tmp/.lock.my-mgr ]
then
echo "Program in use ... exiting ..."
exit 10
fi
/bin/touch /tmp/.lock.my-mgr
/usr/local/bin/myscript.sh
/bin/rm /tmp/.lock.my-mgr
このタスクを数分ごとにまとめて実行するには、cronを使用してタスクをスケジュールします。
編集する:
ループで実行されるスクリプトのPIDは、次の内容を含むファイルに入れることができます。
echo $! > /var/tmp/script1.pid
(スクリプトから)。
2番目のスクリプトで実行されているかどうかをテストするには、psコマンドを使用します。
ps -p `cat /var/tmp/script1.pid`
次に、$? を使用してその状態をテストします。 psがpidを見つけた場合、変数は0でなければならず、そうでなければ1でなければなりません。これは基本的なロジックですが、pidファイルが存在しない場合など、より良いテストで書くことができます。