2013-05-14 7 views
6

RHEL5またはRHEL6のパイプから読み取るときに​​がタイムアウトしないのはなぜですか?ここでRHEL上で `read -t`がbashでタイムアウトしないのはなぜですか?

は私のRHELボックスがパイプからの読み取り誘い込むにタイムアウトしない私の例である:

tail -f logfile.log | grep 'something' | read -t 3 variable 

私が正しいんだ場合read -t 3は3秒後にタイムアウトする必要がありますか?

事前に感謝します。

クリス

GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu) 
+0

場合によっては、 'alias'を呼び出して、' read'があなたのシステム上で別のものにエイリアスされていないことを再確認できますか? –

+0

これをすべてクリアします。 – Chris

+0

'変数'は 'read'コマンドが実行されるサブシェルでのみ設定されることに気づいています。あなたのバージョンの 'bash'は、パイプラインの最後のコマンドを現在のシェルで実行させる' lastpipe'オプションを持っていません。 – chepner

答えて

2

あなたの特定の質問に直接答えていないが、あなたは、パイプラインの完了後に見えるようにvariableの新しく設定された値の順に

read -t 3 variable < <(tail -f logfile.log | grep "something") 

ような何かを実行する必要があります。この時間が予想どおりにタイムアウトするかどうかを確認してください


あなたは、単に一定時間後にパイプラインを終了する方法としてreadを使用しているので、あなたはvariableの範囲を心配する必要はありません。ただし、grepは、独自の内部バッファリングのためタイムアウト内に印刷せずに一致するものが見つかることがあります。あなたは--line-bufferedオプションを使用して、(少なくとも、GNU grepで)それを無効にできます。

tail -f logfile.log | grep --line-buffered "something" | read -t 3 

別のオプションを、可能な場合、readの代替としてtimeoutコマンドです:

ここ
timeout 3 tail -f logfile.log | grep -q --line-buffered "something" 

、私たちは3秒後にtailを抹消し、通常の方法でgrepの終了ステータスを使用します。

+0

+1。同じことを示そうとしていました。 – mata

+0

ありがとうございます。タイムアウト値に達すると、ほとんどの 'read'が終了しますが、' grep'が実際に見つかったものが見つかったとしても常にコード142で終了します。 – Chris

+1

おそらく 'grep -line-buffered'を使って、一致が見つかるとすぐに' grep'が出力するようにしたいと思っています。 – chepner

0

私は今、あなたのスクリプトをテストするためのRHELサーバーを持っていけないが、私は、読み取りがタイムアウトに終了し、それが必要として働いているよりも賭けることができます。試してみてください:

grep 'something' | strace bash -c "read -t 3 variable" 

これは確認できます。

+0

あなたは 'read(0、0x7fff306fc50f、1)=の後に' read'終了しますか? ERESTARTSYS(再起動する) --- SIGALRM(目覚まし時計)@ 0(0)--- 'プロセスはまだハングアップしています。 – Chris

4

chepnerが提供する解決策が有効です。

あなたのバージョンが単純ではない理由:あなたのようなパイプを構築すると、データはパイプを左から右に流れます。しかし、あなたのreadがタイムアウトすると、左側のプログラムは、パイプが壊れていることがわかるまで実行を継続し、パイプに書き込もうとしたときにのみ実行されます。

簡単な例がこれです:5秒後

cat | sleep 5 

sleepが終了しますので、パイプが壊れてしまいますが、あなたがリターンを押すまでcatにもかかわらず、実行し続けます。

これは、grepが結果を生成するまで、そのコマンドがタイムアウトしても実行され続けることを意味します。

関連する問題