アプリケーションを再起動するスクリプトを終了します。

アプリケーションを再起動するスクリプトを終了します。

アプリケーションが終了したことを確認するためにwait()を使用するbashシェルスクリプトがあります。ただし、スクリプト/アプリケーションを終了したいときに終了するのに問題があります。スクリプトのアイデアは、アプリケーションが死んだ場合やソフトウェアの更新が必要な場合はアプリケーションを再起動することですが、アプリケーションを再起動せずにアプリケーションを終了するには、バックドアまたは信号トラップが必要です。

更新後に再起動するとプログラムが終了し、とにかくアプリケーションが終了するとプログラムも再起動します。それが私が必要とするすべてです。ただし、特定の目的のためにアプリケーションを再起動せずにこのスクリプトを終了する特別な方法も必要です。

スクリプトは次のとおりです。

# Initial Launch of the application
/app &

while true
do

   PID=$! #process ID of app

   # The app background process uses exit(0) to possibly end.
   wait $PID 

   if [ -f $FILE ];
   then
      echo "Update successfully"
      mv appcp app
      chmod "+x" app
      /app & # restart
   else
      #error happened if file does not exist 
      #restart
      /app &
   fi
done

ベストアンサー1

この種の作業が機能する可能性があります。起動スクリプトがSIGINTを受け取ったときに呼び出されるシェル関数に「トラップ」を追加しました。

#!/bin/bash

function quitter {
    echo "SIGINT handler, disowning $PID"
    disown $PID
    exit 1;
}

trap quitter SIGINT

FILE=appcp
./app 1000 &
PID=$! #process ID of app

while true
do
   # The app background process uses exit(0) to possibly end.
   wait $PID
   if [[ -f $FILE ]]
   then
      echo "Update successfully"
      mv $FILE app
      chmod "+x" app
      ./app &
   else
      echo plain restart
      ./app &
   fi
   PID=$! #process ID of app
done

トラップハンドラ関数内で実行するのが正しいかどうかはわかりませんがdisown、何をしたいのかわかりません。コンパイルされたプログラムを使用してスクリプトを実行すると、プログラムは1000秒間「アプリケーション」にスリープ状態になります。 「スターター」プログラムのCtrl-Cを押すと、「アプリ」が起動します。これはbash、カーネル4.1.9がインストールされている最新のx86_64 Arch Linuxシステムの4.3.042-3です。

このアプローチで発見された大きな問題は、「アプリケーション」は引き続き実行されていますが、「ランチャー」スクリプトはそれを再び監視できないことです。どういうわけか「アプリケーション」を終了し、「ランチャー」スクリプトを呼び出して監視される「アプリケーション」プロセスをインポートする必要があります。

おすすめ記事