【发布时间】:2016-05-18 01:00:11
【问题描述】:
我正在尝试编写一个记录 Java 程序退出状态的 shell 脚本。该脚本应该简单地启动一个 Java 应用程序,如果 Java 应用程序由于某种原因没有运行,shell 脚本应该检测到这一点并采取缓解措施。
以下是我的脚本:
#!/bin/bash
APPNAME="app"
APPFOLDER=$APPNAME
BACKUP=$APPFOLDER"-backup"
LOGFOLDER=$APPNAME"-log"
echo "Starting new app"
java -jar $APPFOLDER/$APPNAME*.jar > $LOGFOLDER/$APPNAME"_$(date+%Y.%m.%d.%s).log"
wait
STATUS=$?
if [ $STATUS -eq 0 ]
then
echo "Deployment successful" $?
else
echo "Deployment failed: ... derp" $?
fi
我编写了一个运行良好的简单 Swing GUI。但是,我将它打包为一个 jar,但没有指定入口点。因此,我应该得到错误:
Exception in thread "main" java.lang.NoClassDefFoundError: Demo$1
并且脚本应该检测到应用程序无法启动。
在我尝试使用 & 在后台启动 Java 应用程序之前,所有这些都可以正常工作。每当我这样做时:
java -jar $APPFOLDER/$APPNAME*.jar > $LOGFOLDER/$APPNAME"_$(date+%Y.%m.%d.%s).log" &
脚本总是为 $? 返回一个 0,表示它通过了。
我究竟做错了什么?有没有更好的方法来检测应用程序是否启动失败?
谢谢!
【问题讨论】:
-
您想在后台运行应用程序但还要等待它的状态?这不是违背了后台任务的目的吗?
-
我想知道的是应用程序是否在启动时失败。在前者的情况下,我的脚本会打包应用程序并在之前的版本中扮演角色。不过那是在路上。我只需要看看应用程序是否可以正常启动。也许“退出状态”是错误的术语。
-
应该在什么时间点检查状态?您可以等待进程结束(这意味着您不需要后台进程),或者您可以在或多或少的随机点进行检查,因为这需要一些时间(但仍不确定)应用程序失败。您可以定期检查该进程是否仍然存在,我认为这大致是系统守护程序这样做的方法。
-
应用程序在退出之前没有“退出代码”,只有在等待应用程序退出时才能看到该退出代码。因此,正如 zapl 所说,如果您不想等待,那么您可以定期检查您的应用程序以查看它是否仍然存在。 (如果您知道您的应用程序需要
X长时间才能正确启动或死机,那么您可以在该点之后检查一次。但是,更有可能的是,您不知道,那么您只需继续检查 as只要它可能会死或直到你停止关心。 -
@Seanimus 有什么不清楚的地方吗?