このコード (以下) をいくつかの異なる Linux ボックス (4+) でテストしたところ、問題なく動作しました。しかし、ある Linux ボックスで、エラー inputStream(errorStream) のために readline() がハングするという問題に遭遇しました。このストリームは空でなければならないので、ボックスがエラーの errorStream に行末記号を書き込んでいないのではないかと疑っていました。readline() の代わりに read() を使用するようにコードを変更しましたが、read() もハングしました。
最初に入力inputStreamを取得しようとしましたが、それは機能し、エラーinputstreamのreadline()/ read()でハングすることはありませんでした。可能性のあるエラーを最初に取得する必要があったため、これを行うことができませんでした。デッドロックのように見えますが、各入力ストリームを独自のスレッドから読み取ることでこれを解決できました。この問題が 1 つのボックスでしか見られなかったのはなぜですか? これを引き起こした可能性のある、このボックスに固有のカーネル設定またはその他の設定はありますか?
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
}