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