当我从Java进程调用一个shell脚本时,遇到了一些奇怪的行为。
Process p = Runtime.getRuntime().exec("mybashscript.sh");
(new StreamGobblerThread(p.getInputStream())).start();
(new StreamGobblerThread(p.getErrorStream())).start();
p.waitFor();
returnValue = p.exitValue();
StreamGobblerThread仅有一个run()方法,该方法执行以下操作:
while(((inputStream.available>0) { inputStream.skip(available); }
大约20%的时间这个脚本可以工作,但是大多数情况下,它会立即失败并返回141的错误代码。从我在谷歌上找到的信息来看,141是收到SIGPIPE时的返回代码。有什么想法吗?
SIGPIPE
可能是由于在StreamGobblerThread
中从while
循环提前退出引起的。为了检查它,只需使用空的run()
。在循环中添加一些调试打印来查看available
是什么。尝试读取数据而不是跳过。 - khachik