socatパイプとパイプマルチオープン - 書き込み - 閉じると開く - 読み込み - 閉じる操作

socatパイプとパイプマルチオープン - 書き込み - 閉じると開く - 読み込み - 閉じる操作

あるシステムから別のシステムにマルチボリュームtarを送信するために、両方のシステムでsocatを使用しようとしています。潜在的にペタバイト規模のデータをマウントされたテープアーカイブに移動しようとするため、複数のボリュームが絶対に必要です。

最終的に私は次のことをしたいと思います。

#  on system1:
socat PIPE:/tmp/pipe1 SYSTEM:"ssh system2 socat - PIPE\:/tmp/pipe2" &
tar -M -L 10G -F /tmp/chvol -cvf /tmp/pipe1 <source-path> &

#  on system2:
cat /tmp/pipe2 > file001.tar
cat /tmp/pipe2 > file002.tar
...

(chvolスクリプトは単に/tmp/pipe1パスをエコーし​​ます。)

まだ機能していないため、あるシステムで次のようなはるかに簡単なテストを実行しました。

socat PIPE:/tmp/pipe1 PIPE:/tmp/pipe2 &
sh -c 'while sleep 1; do echo "sending date ..."; date > /tmp/pipe1; done' &
sh -c 'while sleep 1; do echo "slurping ..."; cat < /tmp/pipe2; done' &

Open、Write、Close を繰り返す Writer プロセスと EOF まで Open、Read、Close を繰り返す Reader プロセスをシミュレーションするためのものです。

しかし、これは私が期待したものとは異なりました。作者は喜んでいるように見えましたが、読者は蓄積されたテキストを一度に読み、その後は通話がブロックされていましたcat < ...

誰もが(1)単純化されたテストで実際に何が起こっているのか、(2)何をすべきかを説明できますか?

私は両方のパイプに対してさまざまなオプションを試しましたshut-*(問題がEOFの伝播にあると仮定して)、インターネット検索をたくさんしました。

ベストアンサー1

問題は、単方向パイプを望むと指定しないことです。 socatのマニュアルページでは、この場合はエコーのように機能する方法について説明しますPIPE:

おそらく何が起こるのかは、最初にfifo 1に日付を書き込むときにsocatそれを読み、fifo 2に書き込んでからfifo 2に入力があることを確認し、それを読んでfifo 1に書き込むように続けます。catsocatがそれを読む前にfifo 2の最初の項目が正常に空になるまで繰り返します。その後、最初のファイルはcatファイルの終わりを見ずにfifoを読み続け、fifoに日付を書き続けることができます。

-vI / Oを表示するためにsocatにオプションを追加すると、これを確認できます。

-u一方向I / Oを追加すると、おそらくあなたが望むようになるかもしれませんが、今はsocat日付を書いて読んだ後に終了するので、ループが必要です。

while socat -v -u PIPE:/tmp/pipe1 PIPE:/tmp/pipe2; do echo new; done &

あなたのバージョンに応じてコマンドをスクリプトにtar入れることができます。socat/tmp/chvol


物理テープドライブがある場合は、使用されているソリューションを表示することもできます。nbd - サーバーネットワーク経由でブロックデバイスをエクスポートします。

おすすめ記事