socat 管道到管道的多个打开-写入-关闭和打开-读取-关闭操作

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 的传播中)并进行了大量的谷歌搜索。

答案1

您的问题是您没有指定您想要单向管道。 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-服务器通过网络导出块设备。

相关内容