Java から外部アプリケーションを実行する際に問題があります。入力ストリームと出力ストリームの問題を認識しており、次のように読み取ろうとしています。
ProcessBuilder pb = new ProcessBuilder(args);
args[args.length - 1] += "<NUL";
pb.redirectErrorStream(true);
Process p = pb.start();
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader input = new BufferedReader(isr);
while (input.readLine() != null) {
}
p.waitFor();
input.close();
isr.close();
私が実行しているコマンドは、URL に対して xdg-open であるため、入力を待つべきではありません。
これは、私のマシンでは 10 回中 9 回動作しますが、pb.start(); で単にハングすることもあります。コマンドは実行されません。
Java スレッドは、プロセスが戻るのを待っています。スタック トレースは次のとおりです。
Name: LinkHandlerExec
State: WAITING on java.lang.UNIXProcess$Gate@356122dc
Total blocked: 0 Total waited: 1
Stack trace:
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:502)
java.lang.UNIXProcess$Gate.waitForExit(UNIXProcess.java:80)
java.lang.UNIXProcess.<init>(UNIXProcess.java:161)
java.lang.ProcessImpl.start(ProcessImpl.java:81)
java.lang.ProcessBuilder.start(ProcessBuilder.java:468)
strace が教えてくれることは次のとおりです。
$ sudo strace -p 13255
Process 13255 attached - interrupt to quit
futex(0x7fbb673e49d0, FUTEX_WAIT, 13262, NULL