2013-03-18 29 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