【问题标题】:Java: how to check if a program has been correctly launched?Java:如何检查程序是否已正确启动?
【发布时间】:2015-01-25 23:53:15
【问题描述】:

我正在开发一个小的 Java jar 应用程序,用于使用 BaseX 服务器在 file.xml 中存储数据。 一开始,在主程序启动之前,我需要正确启动并激活 Basex Server。所以这就是我所做的:

Runtime runtime = Runtime.getRuntime();

if (isWindows(os)) {
    Process server = runtime.exec("cmd /C basexserver.bat");
    System.out.println(server.waitFor());

}

else {
    if (isLinux(os)) {
        runtime.exec("basexserver");
    }
}

为了检查 BaseXServer 是否正确运行,我尝试检查 waitFor 方法返回的值,如果该值等于 0,则命令成功执行,如果返回值大于 0,则发生错误。问题是这个方法总是返回 1 但命令“basexserver.bat”是正确的。为什么?

【问题讨论】:

    标签: java xml windows command-line command


    【解决方案1】:

    如果进程在启动后进入后台,您可以检查exitValue() 是否为零。其次,您可以使用getErrorStream()getInputStream() 方法附加到错误和标准输出。并监视它们的错误消息。还可以查看流 gbbler 模式,它可能很有用。如果某些进程的输出未被消耗,则可能会卡住。

    https://docs.oracle.com/javase/7/docs/api/java/lang/Process.html http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html

    【讨论】:

    • 感谢您的回复,但恐怕这不起作用,因为“basexserver.bat”会启动服务器,该服务器在主程序关闭之前永远不会停止......所以我不能在 Process 之后调用 waitFor server = runtime.exec("cmd /C basexserver.bat");否则我的程序将阻塞,直到服务器停止,因此无法使用它
    • 在这种情况下,您必须监视错误流。制作一个正则表达式匹配器,它会在出现错误时提醒您。
    • 也许我在混淆......我需要检查的是命令是否成功执行......启动baseX服务器后我无法检查退出值,因为我会得到“java.lang.IllegalThreadStateException : process has not exited"...我希望服务器在使用主程序时一直运行
    • 如果程序还没有退出,唯一的办法就是检查输出。
    • 好的,这就是我要做的。谢谢你:)