【问题标题】:Error on Runtime.getRuntime().execRuntime.getRuntime().exec 上的错误
【发布时间】:2013-09-03 19:49:43
【问题描述】:

我在使用 Runtime.getRuntime().exec 时遇到问题

String line = "";
String output = "";
Process p = Runtime.getRuntime().exec(new String[]{"dmidecode | grep UUID:"});
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
    output += (line + '\n').trim();
}

input.close();

我对此进行了测试,但无法正常工作

String line = "";
String output = "";
Process p = Runtime.getRuntime().exec("dmidecode | grep UUID");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
    output += (line + '\n').trim();
}
input.close();

我在 linux 机器上得到下一个错误:

java.io.IOException: Cannot run program "dmidecode | grep UUID:": error no such file or directory

但是我在控制台中测试了命令,我得到了结果!

dmidecode | grep UUID:=> UUID: 564DAF5F-FBF7-5FEE-6BA4-67F0B12D8E0E

如何使用基于 Java 的 Process 获得相同的结果?

【问题讨论】:

  • 阅读(并实施)所有 When Runtime.exec() won't 的建议。那可能会解决问题。如果没有,它应该提供更多关于失败原因的信息。然后忽略它引用exec 并使用ProcessBuilder 构建Process。还要将 String arg 分解为 String[] args 以说明本身包含空格的参数。

标签: java linux shell process runtime.exec


【解决方案1】:

管道运算符| 无法工作,因为这是命令外壳的一部分。尝试使用 shell 来执行命令。此外,为了方便起见,您可能还想使用ProcessBuilder

ProcessBuilder builder = 
      new ProcessBuilder("bash", "-c", "dmidecode | grep UID:");
builder.redirectErrorStream(true);
Process p = builder.start();

【讨论】:

  • 几乎正确,但“-c”选项的参数需要是单个字符串;即`"bash", "-c", "dmidecode | grep UID:"
猜你喜欢
  • 2011-01-09
  • 2015-08-28
  • 2012-12-07
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多