web-dev-qa-db-ja.com

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

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
8

これがBash while loops が行うことです:

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

アプリケーションを実行し、終了した場合はループの本体を実行します。 :Shellのno-opコマンド です(ループには本体が必要なので、ここに記述します)。その後、先頭に戻り、プログラムを再度実行します。失敗した場合、ループは実行を停止し、スクリプトは終了します。

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

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

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

12
Michael Homer

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

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

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

0
fduff