it-swarm-ja.com

パイプを閉じた後でも、どうすればパイプから読み取りを続けることができますか?

次の呼び出しを行うkshスクリプトがあります。

while read LINE do...

パイプからの入力を読み取るように、入力がリダイレクトされています(図には示されていません)。

問題は、パイプへのライターが閉じると、readがfalseを返し、ループを終了することです。

パイプを閉じた後も読み取りを続けてほしい(書き込みプロセスが時々再開され、この状況が発生する可能性がある)。

読み取りLINE全体をサブシェル内でラップし、サブシェル全体をループしようとしましたが、スクリプトが正常に開始されたときのように入力が増えるまでブロックするのではなく、パイプを閉じた後に読み取りで空の行を取得します。

5
davidparks21

パイプは、2つのプロセス間の通信方法としてカーネルに作成されます。これは通常、親子関係です。プロセスが終了する場合、パイプはありません。カーネル内のパイプのもう一方の端に別のプロセスをアタッチする方法はありません。カーネルは自動的にパイプのシャットダウンを開始し、すべてのリーダーにEPIPEを提供します。

あなたができることは、 名前付きパイプ を作成することです。これはファイルシステムに存在し、ライタープログラムを終了しても閉じられません。パイプに複数のライターを含めることもできますが、これはお勧めしません。書き込みを行っていると思われる「チャンク」は、バッファリングのために異なるチャンクで書き込まれます。

既知のディレクトリにmkfifo /path/to/pipeを使用してパイプを作成し、リーダーかライターかに応じて、stdinまたはstdoutをパイプとの間でリダイレクトします。

6
Rich Homolka

パイプを閉じると、再び開くことはできません。ファイルシステム上の名前付きパイプの詳細はすべてわかりませんが、cat somefile.txt | myprogramのようなことをしているだけなら、catがパイプを閉じるとすぐに、パイプはなくなります。

0
Darth Android