【问题标题】:Runtime exec issues in LinuxLinux 中的运行时执行问题
【发布时间】:2012-07-25 11:44:23
【问题描述】:

在我正在编写的应用程序中,我正在使用 Runtime.exec(...) 启动另一个应用程序(可运行的 JAR)。一切都在 Windows 中成功启动,但 Linux(特别是 CentOS 的某些安装 - 在 Ubuntu 中工作)一直给我一些问题。出于某种原因,辅助应用程序成功启动的唯一方法是我通过终端执行第一个应用程序。所有行为都按预期工作。但是,如果我通过双击第一个应用程序的图标(没有打开终端)启动第一个应用程序,启动第二个应用程序的按钮似乎什么也不做。我没有收到任何异常或错误输出 - 只是我的进度条一闪,说它正在启动,然后什么也没有。我可以通过 jconsole 确认第二个应用程序的进程永远不会启动。

我已经看到了关于 exec 方法的陷阱的常用链接文章 (http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html),但是我在那里找到的任何东西都无法解决这个问题。我实际上正在读取第二个进程的输出和错误流,因为我在它成功运行时看到了所有输出(在通过终端命令启动第一个应用程序之后)。不太了解 Linux 的更深层次的工作原理,我认为这听起来可能是输出流的权限问题之类的,但我不确定。

如果有助于诊断问题,我使用以下命令: rt.exec(new String[]{"\bin\bash", "-c", "java -jar myjarfile.jar myArg1 myArg2 ..."}); 因为这有效(取决于应用程序的启动方式),我不太担心这段代码有什么问题......

有人有什么建议吗?提前致谢!

编辑:解决方案是将目录修复为我试图运行的 JAR。通过 GUI 启动时,user.dir 指向包含我的应用程序的文件夹的父目录。由于我使用的是 Eclipse RCP,我的解决方案是使用 String currDirPath = Platform.getInstallLocation().getURL().toString(); 代替。感谢大家的帮助!

【问题讨论】:

  • 这仍然可能是 stdout/stderr 流的问题。尝试使用popen 而不是exec 并捕获进程的输出。
  • 为什么不尝试使用 ProcessBuilder.start() 而不是 Runtime.exec()?前者总是可取的。
  • 谢谢,伙计们。我会尝试并更新您的建议。

标签: java linux terminal runtime.exec


【解决方案1】:

由于您只是使用 jar 文件名 - myjarfile.jar - 而不是它的完整路径,这取决于当前的工作目录,因此可能会或可能不会找到该 jar。尝试更改您的 exec 命令以使用 jar 的完整路径。您可以通过使用 rt.exec() 将 'pwd' 的输出写入文本文件来进行调试。

【讨论】:

  • 感谢您的意见。我将对此进行调试以确保,但我认为这不是我的问题。在发布我的代码示例时,我忽略了我使用 'String jarLoc = System.getProperty("user.dir") + "/myfolder/myjarfile.jar";'根据工作目录构建 jar 的绝对路径。
  • 当前工作目录(“user.dir”)可能不是您点击图标启动程序时所想的那样。
  • Rajesh 和 Jonathan - 非常有帮助!我意识到user.dir 在通过 GUI 运行时指向包含文件夹的父目录,而不是文件夹本身。解决这个问题解决了我的问题。
【解决方案2】:

而不是

 rt.exec(new String[]{"\bin\bash", "-c", "java -jar myjarfile.jar myArg1 myArg2 ..."});

使用

rt.exec(new String[]{"\bin\bash", "-c", "/***path to java***/java -jar myjarfile.jar myArg1 myArg2 ..."});

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多