【问题标题】:Get status starting Java HTTP server in shell script在 shell 脚本中获取启动 Java HTTP 服务器的状态
【发布时间】:2017-11-23 14:39:02
【问题描述】:

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

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

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

【问题讨论】:

  • 不,不是。如果进程正在运行,则还没有退出代码。当您将进程置于后台时,立即退出代码始终为 0。

标签: java bash http server background-process


【解决方案1】:

我更喜欢使用“pidof”来获取进程的PID,比如:

GETPID=$(pidof java)

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以尝试使用返回码。这是一个例子:
      ➭ 猫脚本.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
      

      【讨论】:

      • 这种情况下服务器不会在后台启动
      • 这似乎失去了 OP 所表达的一个关键特征:服务器作为 background 进程启动。
      • @JohnBollinger 是的,你是对的,我错过了,对不起
      猜你喜欢
      • 2014-09-17
      • 1970-01-01
      • 2017-03-03
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      相关资源
      最近更新 更多