の実行/ /デッドロック飢餓状態に私は、ファイルシステム内の重複ファイルのレポートを作成するためにduff
を使用している:私はにこのレポートを変換するために、いくつかのグルーヴィーなスクリプトを書かれているバッシュパイプラインシェルスクリプトは不十分
duff ~/Photos > ~/Photos/duplicates.txt
約50%の時間で、問題なく美しく動作します。
私のスクリプトの中には、実行を開始しないものや、非常に遅いものがあります。これはなぜですか、それを防ぐために私は何ができますか? (そしてなぜgrepのような「専門的に書かれた」コマンドラインプログラムはこの問題に悩まされない?)
詳しい情報
- しばらく それは(STD入力を受け取るまで、私は、各スクリプトの開始を遅らせますデータなし、2.5秒間スリープ)。スリープ間隔が
- 私は一緒に接続してより多くのパイプが、より頻繁にそれが起こる短かったとき飢餓はここだ
(私はちょうど
cat
後、私のいずれかのスクリプトを実行する場合、私は問題を取得することはありません、) より頻繁でした私のスクリプトのそれぞれを使用しているテンプレート(私はGroovyのランタイムを使用しますが、プレーンなJava構文に固執する):のpublic static無効メイン(文字列[] args)をスロー{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (!br.ready()) { Thread.sleep(2500L); } while (br.ready()) { String inputLine = br.readLine(); // Do stuff }
}
IOExceptionが
ああ、私は '.ready()'がEOFを見るまで読み込みと同等であると思っていました。私はこれを試してみましょう。 (私はあなたがループ条件の中でループ変数に割り当てる恐ろしいイディオムを避けようとしていました)。 –
'ready'への呼び出しがEOFチェックと同等であれば、2.5秒後に再テストするのはちょっとばかげているでしょうか?パイプは、利用可能なデータがないため、EOFを返しません。 (最後の)ライターがファイル記述子を閉じるときにEOFを返します。 – rici
私はあなたが今述べた常識的な側面を熟考しなければならないでしょう。しかしそれまでは、私はこれがうまくいくと言うことができてうれしいです:)ありがとう。 –