Runtime.getRuntime().exec()における出力とエラーフローによるブロックの問題
2321 ワード
テストされたスクリプトコード
エラーメッセージが少ない場合は、エラーフローの情報を処理しなくても問題ありません
しかし、スクリプト内のエラー情報が多く、例えば100を10000に変更すると、ブロックが発生する可能性があります.ここでのバージョンは、エラーフロー内の情報をタイムリーにスレッドで取り出すことです.
最終的にスムーズに実行できるコード
#/bin/sh
echo "step 1"
i=0
while [ $i -lt 100 ]
do
expr 1 / 0
i=`expr $i + 1`
done
echo "step 2"
エラーメッセージが少ない場合は、エラーフローの情報を処理しなくても問題ありません
import java.io.*;
public class T {
public static void main(String[] args) throws Exception {
final Process p = Runtime.getRuntime().exec("/data/home/robinmei/t.sh");
p.waitFor();
p.exitValue();
}
}
しかし、スクリプト内のエラー情報が多く、例えば100を10000に変更すると、ブロックが発生する可能性があります.ここでのバージョンは、エラーフロー内の情報をタイムリーにスレッドで取り出すことです.
最終的にスムーズに実行できるコード
import java.io.*;
public class T {
public static void main(String[] args) throws Exception {
final Process p = Runtime.getRuntime().exec("/data/home/robinmei/t.sh");
Thread outThread = new Thread() {
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println("out=[" + line + "]");
}
} catch (Exception e) {
}
}
};
outThread.start();
Thread errThread = new Thread() {
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println("err=[" + line + "]");
}
} catch (Exception e) {
}
}
};
errThread.start();
outThread.join();
errThread.join();
p.waitFor();
p.exitValue();
}
}