あるシステムから別のシステムにマルチボリューム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に書き込むように続けます。cat
socatがそれを読む前にfifo 2の最初の項目が正常に空になるまで繰り返します。その後、最初のファイルはcat
ファイルの終わりを見ずにfifoを読み続け、fifoに日付を書き続けることができます。
-v
I / 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 - サーバーネットワーク経由でブロックデバイスをエクスポートします。