Bash忽略退出Java应用程序

时间:2013-03-18 11:58:56

标签: java bash shell

我有一个简单的BASH脚本,它包装了一个java程序,目的是在应用程序崩溃时重新启动它:

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

但是,如果退出Java进程,它也会退出bash脚本,因此永远不会再启动该进程。

E.g。 (指着假班):

$ ./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.
$

有没有办法可以捕获错误(但仍会显示错误)以允许脚本继续运行?

2 个答案:

答案 0 :(得分:5)

删除exec。这完全用Java VM替换了当前进程(你的shell)。

删除它,它应该可以正常工作。

答案 1 :(得分:0)

正如Mat所说, exec 的作用是用Java进程替换当前的shell进程。它失败了,没有人等着它重新启动它。 exec 可以是一个非常有用和专业的工具,但它相当先进。

正确使用它的一个例子是在当前shell中设置变量或优先级的脚本,然后执行你要包装的进程。

似乎没有使用变量“STOP”。我只想去找:

while ! java com.site.app.Worker
do
    echo Failed: Sleeping and restarting >&2
    sleep 3 
done