我正在尝试在两个系统上使用 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-服务器通过网络导出块设备。