私は外部プロセスでシェルスクリプトを実行しているスレッドを持って実行を停止し、次のように私は、この外部プロセスから標準エラー出力と標準出力ストリームに読み取るためにApacheのIOUtilsを使用しています:スレッドは
Thread t = new Thread(()-> {
ProcessBuilder pb = new ProcessBuilder("sh");
Process p = null;
try {
p = pb.start();
OutputStream os = p.getOutputStream();
os.write("sleep 30 ; echo test".getBytes());
os.flush();
os.close();
InputStream is = p.getInputStream();
InputStream es = p.getErrorStream();
String stdout = IOUtils.toString(is,"UTF-8");
String stderr = IOUtils.toString(es,"UTF-8");
int retval = p.waitFor();
} catch (Exception e) {
System.out.println("Got exception: "+e.toString());
} finally {
System.out.println("Done now!");
}
});
t.start();
Thread.sleep(7000);
t.interrupt();
何らかの理由で、このテストケースを実行すると、例外がスローされることはありません(catch
ブロックは実行されません)。finally
ブロックは決して実行されません。私が捕まえていない問題がいくつかありますか? stdoutとstderrを別のスレッドで収集する必要がありますか?