我在几个不同的 linux 机器(4+)上测试了这段代码(下面),它运行良好。但是,在一个 linux 机器上,我遇到了 readline() 因错误 inputStream(errorStream) 而挂起的问题。这个流应该是空的,所以我怀疑那个盒子没有为错误写出一个行终止符到errorStream。我将代码更改为使用 read() 而不是 readline() ...但 read() 也挂起。
我首先尝试检索输入 inputStream,并且工作正常,并且对于错误输入流,readline()/read() 没有挂起。我不能这样做,因为我需要先获取可能的错误。似乎是一个死锁,我能够通过让每个输入流从它自己的线程中读取来解决这个问题。为什么我只在一个盒子上看到这个问题?是否有内核设置或其他特定于此框的设置可能导致此问题?
ProcessBuilder processBuilder = new ProcessBuilder()
try
{
Process processA = null;
synchronized (processBuilder)
{
processBuilder.command("/bin/sh","-c"," . /Home/SomeScript.ksh");
processA = processBuilder.start();
}
inputStream = processA.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream));
errorStream = processA.getErrorStream();
errorReader = new BufferedReader(new InputStreamReader(errorStream));
String driverError;
while ((driverError = errorReader.readLine()) != null)
{
//some code
}