私はこれをしばらく機能させるためにいじっていますので、パイプがどのように機能するかについてのある種の根本的な誤解が私のトラブルの根本的な原因であると思います。
私の目標は、netcat
を介して一部のリモートホストへのTCP接続を開始し、ファイルシステムに2つの名前付きパイプを持っていることです。これらのプロセスは、送信データとして機能するように書き込みを行うことができます。
mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &
ここから、私は他のプロセスがこのオープンから読み書きできるようにしますTCP=接続。これが「うまくいく」か、またはこのような構造ができる理由があります '働く?
現在発生しているseemsは、out
から問題なく読み取ることができるということですが、in
に書き込むと、壊れたパイプとその後のすべての通信についての出力が表示されます死んでいるようです。考え?
(関連:私が最初に使用した:
netcat foo.bar.org 4000 < out > in &
しかし、入力待ちをブロックすることがわかりました。これについても知りたいのですが、おそらく別の質問で対処する方がよいでしょう。)
cat out | netcat foo.bar.org 4000 > in &
問題は、cat
がEOF
パイプからout
を受信するとすぐに終了することです。そして、cat
が終了すると、残りのパイプライン(netcat
を含む)も終了します。
代わりに次のようなものを試してください:
while true; do cat out; done | netcat foo.bar.org 4000 > in &
したがって、cat
は必要に応じて何度でも再起動され、EOF
パイプに現れるout
sは効果的に処理されます。
私もこの問題に直面していました。主な問題はnetcat
です。これは優れたツールですが、接続されている入力ファイル記述子または出力ファイル記述子のいずれかが閉じられると、接続を閉じます。サーバーがリッスンしていないときは何もせず、他のピアが閉じているときに終了します。サーバーを正しく設定し、ファイル記述子を開いたままにしておけば、サーバーは機能します。たとえば、私は次のシナリオをテストし、それは非常にうまくいきました:端末のセットアップでエコーサーバー(私は以下のようにセットアップしました):
mkfifo loopFF
netcat -t -l -p 4000 <loopFF | tee loopFF
別のターミナルで、サーバーへのfifo接続をセットアップします。
mkfifo in
mkfifo out
netcat 127.0.0.1 4000 <out >in &
サーバーが送信したものをすべて出力します(終了時に一端を閉じるアプリケーションでin
fifoを使用すると、netcat
は接続を閉じます)
cat in &
そして同じターミナルで:
cat > out
ここで、入力したものはすべて(Enterキーを押した後)再び印刷されます。このコマンドを閉じると、接続も閉じます。
Steven Mondayの分析は私には良さそうです。FIFOがcat
であるため、out
はempty
への最初の書き込み後に戻ります。それを回避するための解決策は、書き込みモードでfifoを開いた状態でプロセスを維持することです。次の例では、最初のcat
を使用しています。
_mkfifo in
mkfifo out
cat > out &
echo $! > out-pid
cat out | netcat foo.bar.org 4000 > in &
_
(out-pidファイルは、全体を停止する方法です:kill -9 $(cat out-pid)
。)
別の例 here 。