【发布时间】:2010-11-17 20:27:49
【问题描述】:
我在从 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。
根据我在 google 上的发现,141 是收到 SIGPIPE 时的返回码。
有什么想法吗?
【问题讨论】:
-
也许你应该打印出错误,它们可能会给你一个有意义的错误信息。
-
SIGPIPE可能是由于在StreamGobblerThread中提前退出while造成的。要检查它,只需使用空的run()。在循环中添加一些调试打印以查看available是什么。尝试读取数据而不是跳过。 -
似乎除了脚本的返回码之外没有“错误”,因为它不是发生的java异常。所有java似乎都知道脚本的退出代码
-
如果你注释掉你为错误流启动线程的行,它会做同样的事情吗?
-
我将尝试将错误线程注释掉。这段代码显然已经在生产环境中运行了很长时间没有问题,但它可能工作正常,只要没有任何东西进入 stderr
标签: java linux bash stream signals