在 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
我的问题会有点难以解释,所以请耐心等待。
我正在尝试编写一个 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