基本スクリプトが停止したら、インラインバックグラウンドプロセスをどのように停止しますか?

基本スクリプトが停止したら、インラインバックグラウンドプロセスをどのように停止しますか?

シェルスクリプトで、次の操作を行います。

#!/bin/sh

while true; do <some application>; sleep 1; done &

... rest of the scrip ...

これはスクリプトの残りの部分に必要なものであり、アプリケーションが常に実行されることを保証します。しかし、スクリプトは弾力性があるため、アプリケーションが実行されておらず、誤って応答しているように見えない場合は、後でもう一度やり直してください。

SIGTERMたとえば、またはによってデフォルトのスクリプトが終了した場合は、このループも停止したいとSIGINT思います。while基本スクリプトが終了した後もアプリケーションを実行する必要はありません。

シェルスクリプトでこれを行う一般的な方法は何ですか?私が望むものは2つあります。

  1. アプリケーションの再実行防止
  2. 現在実行中のアプリケーションインスタンスをできるだけ早く停止してください。

シェルスクリプトでこれを行う方法がわかりません。INTandをキャプチャできますが、ループにロジックを挿入する方法とアプリケーションを停止する方法が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ファイルが存在しない場合など、より良いテストで書くことができます。

おすすめ記事