Tar

用於多個打開-寫入-關閉和打開-讀取-關閉操作的 socat 管道到管道

  • April 20, 2017

我正在嘗試在兩個系統上使用 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通過網路導出塊設備的解決方案。

引用自:https://unix.stackexchange.com/questions/360157