用於多個打開-寫入-關閉和打開-讀取-關閉操作的 socat 管道到管道
我正在嘗試在兩個系統上使用 socat 以便將多卷 tar 從一個系統發送到另一個系統。多卷是絕對要求,因為我正試圖將潛在的 PB 數據轉移到已安裝的磁帶存檔中。
最終,我想做這樣的事情:
# 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' &
這是為了模擬一個寫入程序重複打開、寫入、關閉和一個讀取程序重複打開、讀取直到 EOF、關閉。
但這並不像我預期的那樣:作者似乎很高興,但讀者一口氣閱讀了所有累積的文本,然後在
cat < ...
通話中保持阻塞。任何人都可以解釋(1)在大大簡化的測試中實際發生了什麼以及(2)我應該做什麼?
我已經
shut-*
在兩個管道上嘗試了各種選項(假設問題出在 EOF 的傳播中)並且做了很多Google搜尋。
你的問題是你沒有指定你想要單向管道。socat 手冊頁解釋了在這種情況下如何
PIPE:
像迴聲一樣。可能發生的情況是,當您第一次將日期寫入 fifo 1 時,您
socat
讀取它,將其寫入 fifo 2,然後注意到 fifo 2 上有輸入,因此讀取它並將其寫入 fifo 1,等等忙循環直到fifo 2 上的第一個cat
在 socat 讀取它之前設法清空它。此後,這首先cat
將繼續讀取 fifo,永遠不會看到文件結尾,您可以繼續將日期寫入 fifo。如果您將
-v
選項添加到 socat 以顯示 i/o,您可以看到這一點。添加
-u
單向 i/o 使其成為您可能想要的,但現在socat
將在寫入和讀取日期後退出,因此您需要一個循環:while socat -v -u PIPE:/tmp/pipe1 PIPE:/tmp/pipe2; do echo new; done &
使用您的
tar
版本,您可以將socat
命令放在/tmp/chvol
腳本中。如果您有真正的磁帶驅動器,您還可以查看使用nbd-server通過網路導出塊設備的解決方案。