0

アプリケーションがクラッシュした場合に再起動することを目的として、Java プログラムをラップする単純な BASH スクリプトがあります。

STOP=0
while [ "$STOP" -eq 0 ]
do
        echo "Starting"
        exec java com.site.app.Worker
        echo "Crashed"
        sleep 3
done

ただし、Java プロセスが終了すると、bash スクリプトも終了するため、プロセスが再び開始されることはありません。

例(偽のクラスを指している):

$ ./RestartApp.ksh
Starting
Exception in thread "main" java.lang.NoClassDefFoundError: com/site/app/Worker
Caused by: java.lang.ClassNotFoundException: com.site.app.Worker
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: com.site.app.Worker.  Program will exit.
$

スクリプトの実行を継続できるように、エラーをキャッチして (ただし、エラーを表示して) 方法はありますか?

4

2 に答える 2

5

Remove the exec. That's completely replacing the current process (your shell) with the Java VM.

Just remove that and it should work fine.

于 2013-03-18T12:02:25.370 に答える
0

Mat が言ったように、execが行うことは、現在のシェル プロセスを Java プロセスに置き換えることです。失敗した場合、再起動を待っている人は誰もいません。 execは非常に便利でプロフェッショナルなツールですが、かなり高度です。

その正しい使用例は、現在のシェルで変数または優先順位を設定するスクリプトであり、その後、ラップしているプロセスを実行します。

変数「STOP」は使用されていないようです。私は単に行きます:

while ! java com.site.app.Worker
do
    echo Failed: Sleeping and restarting >&2
    sleep 3 
done
于 2013-03-24T19:51:21.683 に答える