我有一个简单的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 :(得分: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