【问题标题】:Check exit code on a UNIX command from Java从 Java 检查 UNIX 命令的退出代码
【发布时间】:2015-08-10 08:33:18
【问题描述】:

我遇到需要从 .jar 执行 UNIX 命令的情况。我已经尝试了以下(日期是任意的):

    java.lang.Runtime rt = java.lang.Runtime.getRuntime();
    java.lang.Process p = rt.exec("sudo date --set=\"Tue Aug 11 10:10:20 BST 2015\"");
    p.waitFor();
    logger.log("executed with value: " + p.exitValue());

我只是想知道在这种情况下是否有办法检查退出代码?

注意:我以这种方式执行了一个命令,即“sudo mkdir -p /root/abcd”,它确实有效。

【问题讨论】:

  • 有什么问题? exitValue 确实返回退出代码。
  • 要调试问题,您可能需要读取并显示程序的输出,这些输出通过您可以使用 getInputStream() 和 getErrorStream() 检索的流传递给您的 java 程序。如果 sudo 要求输入密码,我不会感到惊讶。
  • @Eelke sudo 不要求输入密码,这让我很担心。
  • “检查退出代码”是什么意思? 0 值表示进程正确终止。任何其他值都意味着不成功的终止。

标签: java unix


【解决方案1】:

我认为p.waitFor()不是您需要的功能 - 看看这里的原因:waitFor -Process。 如果你使用p.destroy(),你会得到你的返回值。

编辑:我发现本教程的代码与我使用的类似:) Tutorial

【讨论】:

  • Process.destroy() 将终止子进程,返回类型为void。为什么你认为这会给出退出值?
  • 我认为这是问题的问题。我证明如果子进程结束,函数exitValue() 返回正确的值。 destroy()-函数证明了这一点。就像你提到的那样,它会杀死子进程,然后你得到一个返回值。
  • 该示例对 Windows GUI 应用程序有效,但对控制台程序无效。 destroy 尝试快速终止进程。对于控制台程序,这通常意味着中断信号 (ctrl+c) 或终止信号。这意味着该命令未成功完成。您需要使用 waitfor 以便该进程可以执行它应该执行的操作。
  • 为什么要投反对票?我得到了返回值,这不取决于进程是否正常终止或被破坏?这个答案没有错。
  • @MrT 我同意在这种情况下投反对票是错误的,答案解决了一个问题并指出了更多信息的良好来源。我会投赞成票,但这只会抵消你的投反对票
【解决方案2】:

p.waitFor() 就足够了,我查看了错误的日志文件……有点尴尬,但承认这些错误是避免重复它们的第一步。谢谢大家的帮助!

【讨论】:

    猜你喜欢
    • 2019-01-26
    • 1970-01-01
    • 2013-09-14
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多