在shell脚本中启动Java HTTP服务器的状态
问题描述:
我的问题会有点难以解释,所以请耐心等待。在shell脚本中启动Java HTTP服务器的状态
我想写一个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文件良好时停止服务器,因此无法将该进程发送到后台。
有没有简单的方法来完成这个?
答
这样做的一个常见方式是完全忽略退出状态,而是检查服务器是否成功启动
# 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
这是赌注:超时(在这里,它会打开端口8080
为探测由nc
)内比确保流程持续运行30秒而不会死亡,因为在快乐的情况下,它会很快地继续下去。
如果进程死亡,您可以另外立即中止(与kill -0 $!
一起检查)。这可能适用于您的java
命令,但其他服务器(如Apache)具有在服务器继续运行时立即退出的启动命令。
答
您可以尝试使用返回码。这里有一个例子:
➭猫script.sh
#!/bin/bash
java -jar "$1"
STATUS="${?}"
if [ $STATUS -eq 0 ]
then
echo "Good"
else
echo "Bad"
fi
用法:
➭ ./script.sh good.jar
...
Good
➭ ./script.sh bad.jar
...
Bad
答
我更愿意用 “的pidof” 获得进程的PID,例如:
GETPID=$(pidof java)
if [ "${GETPID}VVV" == "VVV" ] ; then
echo "The process is BAD"
else
echo "The process is OK"
fi
没有,真的没有。如果进程正在运行,那么还没有退出代码。在后台放置进程时,立即退出代码始终为0. – Jack