クラッシュしたときにアプリケーションスクリプトを再実行しますか?


18

ラップトップで常に実行する必要があるアプリケーションがいくつかあります。

これらのアプリケーションを起動するには、bashスクリプトを使用します。私のスクリプトには、次のようなループがあります。

while true;
do
    xterm
done

これにより、アプリケーション(xtermこの場合)が実行され、アプリケーションがクラッシュした場合、ループが再開します。

これには、このループから「クリーン」な出口がないという欠点があります。したがって、ユーザーの意図が閉じることであったxtermとしても、ループはそれを再び開始します。

bashスクリプトからアプリケーションを起動する方法実行中かどうかを監視する方法、スクリプトがクラッシュした場合に再実行する方法、またはユーザーが適切に閉じた場合は何もしない方法ありますか?

回答:


30

これを試して:

while true; do xterm && break; done

アプリケーションには終了ステータスコードがあるため、正常に終了した場合はゼロが返されます。また、何か問題が発生した場合は、別の番号がスローされます。これにより、人々はフックして、正確な問題を見つけることができます。これは他の答えがしていることです。

&&前のコマンドがゼロ状態の出口であったかどうかを確認し、そうであればループを中断します。クラッシュすると、0以外のものがスローされ、&& ...句はトリガーされません。単にループバックして実行しxtermます。


6
それは非常にエレガントです。
オリ

うーん..逆もまた同様ですwhile xterm; do true; done
。– muru

1
@muru:私にとってはこの作品:while ! xterm; do :; done
サイラス

1
@Cyrusああ、はい。を忘れました!
ムル

モンスターを作成しました。どうやって殺すの?
トニールース

6

ではwhile条件あなたはの終了ステータスがいるかどうかをテストすることができますxterm成功したかどうか、このようなものでした。

result=1
while [ $result -ne 0 ]; do
    xterm
    result=$?
done

$? 変数は、最後に実行されたコマンドの終了ステータスを保持します。


0

使用することをお勧めします。

xtermまで 「プログラムはステータス$で終了しました」をエコーし​​ますか?; やった

これにより、プログラムが強制終了された場合にプログラムが再実行されます。


0

実行するプログラムまたはスクリプトを追加するのが非常に簡単で簡単なスーパーバイザーを使用てみてください。あなたが必要とする最低限のあなたの場合には、多分にあるprogramx断面構成します。commandexitcodes

デフォルトexitcodesは0,2であるため、次のことを意味します。

このリストで定義されていない終了コードで終了した場合、supervisordはプロセスを再起動します

一般的には、スクリプトがクラッシュした場合は再実行するか、ユーザーが適切に閉じた場合は何もしません(またはスクリプトが正常に完了しました)。

最初に最も単純な構成を試してください。

[program:you_app_name]
command=/path/to/you/app

柔軟性を高めるには、構成ファイルのドキュメントを参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.