我的问题会有点难以解释,所以请多多包涵。
我正在尝试编写一个将 Java HTTPServer
作为后台进程启动的 shell 脚本。脚本中的相关行看似很简单:
java -jar "$jar.jar"&
但是,当 Java 尝试运行 jar 时,我需要以某种方式检查是否没有问题。例如,如果我要 touch Server.jar
,我想捕获 java 运行该空 jar 的失败。所以,我试图将它包装在一个 if 语句中:
if ! java -jar "$jar.jar" &
then
echo "Couldn't start server" >&2
fi
这行不通。无论 java 实际上是否能够运行 jar
,返回的状态都是相同的。我注意到,如果我在末尾省略了 & 符号,它会在 jar
错误的情况下执行我想要的操作。但是,这显然会导致脚本在该行等待,直到 jar 正常时服务器停止,因此无法将进程发送到后台。
有什么简单的方法可以做到这一点吗?
最佳答案
这样做的一种常见方法是完全忽略退出状态,而是检查服务器是否在超时内成功启动(这里它打开端口 8080
由 nc< 探测
):
# Start server
java -jar "$jar.jar" &
# Wait for up to 30s
printf "%s" "Waiting for server to respond"
timeout=30
until nc -z localhost 8080 || (( --timeout == 0 ))
do
sleep 1
printf "."
done
# Check result
if (( timeout > 0 ))
then
echo "Server started successfully"
else
echo "Server still not responding"
fi
这比确保进程运行 30 秒而不会死亡要好,因为在理想情况下它会很快继续。
如果进程终止,您还可以使其立即中止(使用 kill -0 $!
检查)。这可能适用于您的 java
命令,但 Apache 等其他服务器的启动命令会在服务器保持运行时立即退出。
关于java - 在 shell 脚本中获取启动 Java HTTP 服务器的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44663438/