2017-06-20 106 views
1

我的问题会有点难以解释,所以请耐心等待。在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文件良好时停止服务器,因此无法将该进程发送到后台。

有没有简单的方法来完成这个?

+1

没有,真的没有。如果进程正在运行,那么还没有退出代码。在后台放置进程时,立即退出代码始终为0. – Jack

回答

3

这样做的一个常见方式是完全忽略退出状态,而是检查服务器是否成功启动

# 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)具有在服务器继续运行时立即退出的启动命令。

0

您可以尝试使用返回码。这里有一个例子:
➭猫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 
+0

服务器在此情况下不会在后台启动 – Petr

+0

这似乎失去了OP所表达的关键特征:服务器以*背景*过程。 –

+0

@JohnBollinger是的,你是对的,我错过了这个,对不起 –

0

我更愿意用 “的pidof” 获得进程的PID,例如:

GETPID=$(pidof java) 

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