我已阅读了很多示例,最后使用以下代码从Java程序内部执行命令行命令。
public static void executeCommand(final String command) throws IOException,
InterruptedException {
System.out.println("Executing command " + command);
final Runtime r = Runtime.getRuntime();
final Process p = r.exec(command);
System.out.println("waiting for the process");
p.waitFor();
System.out.println("waiting done");
try (final BufferedReader b = new BufferedReader(new InputStreamReader(
p.getInputStream()))) {
String line;
while ((line = b.readLine()) != null) {
System.out.println(line);
}
}
}
我用一个简单的ls命令对它进行了测试,它运行正常。当我尝试运行另一个命令时,它将永远运行(保持运行25分钟并且还没有停止)。
当我在命令行上执行tabix命令时,我得到以下统计信息
4.173u 0.012s 0:04.22 99.0%0 + 0k 0 + 0io 0pf + 0w
因此它应该快速完成。
命令是
时间tabix文件pos1 pos2 ... pos190>的/ dev / null的
问题可能是tabix命令最后包含> /dev/null
吗?如果没有,可能导致这个问题的原因是什么?
答案 0 :(得分:2)
您需要将读者附加到之前调用它waitFor
。没有它,可以填充它分配的输出缓冲区然后阻塞 - 但只有大输出,小(例如测试)输出似乎没问题。
public static void executeCommand(final String command) throws IOException, InterruptedException {
System.out.println("Executing command " + command);
// Make me a Runtime.
final Runtime r = Runtime.getRuntime();
// Start the command process.
final Process p = r.exec(command);
// Pipe it's output to System.out.
try (final BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = b.readLine()) != null) {
System.out.println(line);
}
}
// Do this AFTER you've piped all the output from the process to System.out
System.out.println("waiting for the process");
p.waitFor();
System.out.println("waiting done");
}