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

Get status starting Java HTTP server in shell script

我的问题会有点难以解释,所以请耐心等待。

我正在尝试编写一个 shell 脚本,它将启动一个 Java HTTPServer 作为后台进程。脚本中的相关行看似很简单:

java -jar "$jar.jar" &

但是,当 Java 尝试 运行 jar 时,我需要以某种方式检查是否没有问题。例如,如果我要 touch Server.jar,我想捕获 java 对 运行 那个空罐子的失败。所以,我试图将它包装在一个 if 语句中:

if ! java -jar "$jar.jar" &
then 
    echo "Couldn't start server" >&2
fi

这行不通。无论 java 是否真的能够 运行 或 jar,返回的状态都是相同的。我注意到,如果我在末尾省略了 & 符号,它会在 jar 错误的情况下执行我想要的操作。但是,这显然会导致脚本在该行等待,直到 jar 好时服务器停止,因此无法将进程发送到后台。

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

您可以尝试使用return代码。这是一个例子:
➭ 猫 script.sh

#!/bin/bash
java -jar ""
STATUS="${?}"
if [ $STATUS -eq 0 ]
then
    echo "Good"
else
    echo "Bad"
fi

用法:

➭ ./script.sh good.jar
...
Good

➭ ./script.sh bad.jar
...
Bad

一种常见的做法是完全忽略退出状态,而是检查服务器是否在超时内成功启动(这里它打开 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)的启动命令会在服务器保持 运行.

时立即退出

我比较喜欢用"pidof"来获取进程的PID,比如:

GETPID=$(pidof java)

if [ "${GETPID}VVV" == "VVV" ] ; then
    echo "The process is BAD"
else
    echo "The process is OK"
fi