2016-07-15 15 views
0

krakenでいくつかの画像を表示しようとしました。私はそれを行うためのコンソールコマンドを用意しました。 それは遅かったので、それをgnuと並列に組み合わせました。Java起動端末実行時のプロセスが不完全

find temp/ -name '*.tif' -or -name '*.jpg' | parallel -j4 kraken -i {} {}.html binarize segment ocr -h 

これは端末でこれを行うときにうまくいきます。これをjava(eclipse)で起動すると、30個の画像の後で実行が停止します。終了しません。それは、無効なプロセスを残した。

String command = "find temp/ -name '*.tif' -or -name '*.jpg' | parallel -j4 kraken -i {} {}.html binarize segment ocr -h"; 
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c",command}); 
p.waitFor() == 0; 

私はいくつかの構成(より多くのメモリ(eclipseとexceution)、少ないスレッド)を試しましたが、何も助けませんでした。

プロセスの不在を回避するためのアイデアや、実行を再び開始する方法はありますか?

答えて

0

ほとんどの場合、問題はプロセスの出力を消費していないため、出力バッファがいっぱいになり、プロセスが停止するということです。

試してみてください。

String command = "find temp/ -name '*.tif' -or -name '*.jpg' | parallel -j4 kraken -i {} {}.html binarize segment ocr -h"; 
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c",command}); 
InputStream is = p.getInputStream(); 
// is.skip(Long.MAX_VALUE); Doesn't work 
while (is.read() != -1) { } // consume all process output 
p.waitFor(); 

完全なソリューションもエラーストリームを処理します。これは、エラーストリームからの入力を読み書きする別のスレッドを開始することで実行できます。

(または、bashコマンドスクリプトで出力を/dev/nullにリダイレクトすることもできます)。

+0

エラー(無効なシーク)にスキップしますが、dev/nullへのリダイレクトされた出力は正常に動作します –

関連する問題