java - 在 shell 脚本中获取启动 Java HTTP 服务器的状态

标签 java bash http server background-process

我的问题会有点难以解释,所以请多多包涵。

我正在尝试编写一个将 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 正常时服务器停止,因此无法将进程发送到后台。

有什么简单的方法可以做到这一点吗?

最佳答案

这样做的一种常见方法是完全忽略退出状态,而是检查服务器是否在超时内成功启动(这里它打开端口 8080nc< 探测):

# 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/

相关文章:

java - 按顺序和逆顺序打印

mysql - 如何将 CSV 列批量加载到 MySQL 表中

java - 使用 bash 脚本设置 java ProcessBuilder 环境

bash - 如何扩展包含文本和其他变量混合的变量?

javascript - 使用 Node : "$.ajax is not a function" 执行 js 代码时出错

java - 如何从表格的第一列获取文本?

java - 如何使用Ant Web Start在build.xml中添加安全权限

java - 在开始新 Activity 之前等待 HttpRequest 完成

javascript - 是否减少 HTTP 请求?

javascript - 如何检查 Json 文件更新,如果更新则用更新的数据刷新我的页面