2013-03-18 23 views
0

我有一个封装了Java程序,如果该应用程序崩溃重新启动它的意图一个简单的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. 
$ 

有没有一种方法可以捕获错误(但仍显示它们)以允许脚本继续运行?

+0

bash文件在哪里?从你编写你的课程的地方开始? – Sach 2013-03-18 12:03:05

回答

5

删除exec。这完全取代了Java VM的当前进程(你的shell)。

只要删除它,它应该工作正常。

0

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

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

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

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