プログラムを実行し、クラッシュせずに終了した場合に再度実行するBashスクリプトを作成する


8

MacOSXでアプリを実行するbashスクリプトを作成する最も簡単な方法を知りたいです(これはUNIXベースのシステムなので、これが正しい場所だと思いました)。プログラムが終了するのを待ちます。出口がクラッシュではなかった場合は、もう一度実行します。それ以外の場合は、クラッシュレポートウィンドウを開いたままにして終了します。

このスクリプトは、クラッシュまたは手動で終了するまで永遠に実行させてください。

私は漠然とした考えを持っていますが、よくわかりません。ここに私がこれまで持っているものがあります:

echo "Launching Autorun…"

if ["$1" -eq "0"]; then
# Application exited successfully. Restarting.
/path/to/application.app
else
# An error occured. Do nothing and exit.
    exit
fi

ほとんどの場合、何らかの理由でスクリプトが永久に実行されることは望ましくありません。サービス -またはデーモン -を永久に実行したい。私は彼らがAppleでそれをどのように行うのか知りませんが、おそらくあなたのinitシステムをもう少し詳しく見て、それにサービスを登録する方法があるかどうかを調べる必要があります。通常、デーモンは状態を更新/保存するために定期的に自身をrexecします-実際には永久にループしません。
mikeserv 2014

回答:


12

これは、Bashのwhileループが行うことです。

while /path/to/application.app
do
    :
done

アプリケーションを実行し、正常に終了した場合はループの本体を実行します。:あるシェルのノーオペレーションコマンドは、(ループは私たちがそこに置か何のことを、身体を持っている必要があります)。その後、先頭に戻り、プログラムを再度実行します。失敗した場合、ループは実行を停止し、スクリプトは終了します。

ただし、実行しているのは通常のMacアプリケーション(.app)のようです。その場合、いくつかの問題が発生します。1つは、アプリケーションディレクトリを直接実行するのではなく、openコマンドを使用する必要があることですopen /path/to/application.app

もう1つはopen、アプリケーションが何を実行するかに関係なく、実行すると通常はすぐに成功して終了するということです。これは完全に普遍的というわけではありませんが、ほとんどの場合そうです。その場合は、アプリケーションが終了するまで-W強制的openにブロックするオプションを使用できますopen -W /path/to/application.app。アプリケーションがすでに実行されている場合は、既存の実行が終了するまで待機することに注意してください。

それがどれほどの問題であるかは、実行しているアプリケーションによって異なります。うまく再生されない場合は、シェルからこれを行うのが最善の選択肢ではない可能性があります。その場合は、AppleScriptを使用したほうがよいでしょう。これについてはAsk Askで質問できます。


上記のソリューションをテストしたときに意図的にクラッシュする可能性があるMac上のアプリがあります。クラッシュ後も自動的にアプリを再起動します。アプリケーションの終了を確認する方法はありますか?openは明らかに0の終了で終了するため、関係なく再び実行されます。
Ben Crazed Up Euden 2014

@BenCrazedUpEuden:私の理解では、open特定の起動エラーに対してのみ失敗が返されるということです。アプリケーションは直接ではなくシステムサービスによって開始されるため、直接通信チャネルが戻ることはありません。場合によっては、アプリケーション実行可能ファイルを直接起動することができます/Applications/YourProgram.app/Contents/MacOS/YourProgram。それ以外の場合は、Unixから離れて、Ask Differentでより適切な答えが得られる場所に移動しています。シェルからAppleScriptを実行できますosascript
Michael Homer

0

私はこれをテストしました:

#!/bin/bash
while <your_cmd_here>
do
    true
done

これは、コマンドの戻りコードをPOSIXスタイルでテストすることで機能します。0はOKを意味し、それ以外はエラーとして処理できます。

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