2010-08-09 74 views
0

假设你运行下面的命令:数据完整性问题

 
ssh $host1 'while [ 1 ]; do sleep 1; echo "Hello from $HOSTNAME"; done' > /tmp/output 
ssh $host2 'while [ 1 ]; do sleep 1; echo "Hello from $HOSTNAME"; done' >> /tmp/output 
ssh $host3 'while [ 1 ]; do sleep 1; echo "Hello from $HOSTNAME"; done' >> /tmp/output 

然后输出将如下所示:

 
Hello from host1 
Hello from host2 
Hello from host3 
Hello from host1 
... 

但如果我把它改成

 
ssh $host1 'while [ 1 ]; do sleep 1; cat /some/large/file1.txt; done' > /tmp/output 
ssh $host2 'while [ 1 ]; do sleep 1; cat /some/large/file2.txt; done' >> /tmp/output 
ssh $host3 'while [ 1 ]; do sleep 1; cat /some/large/file3.txt; done' >> /tmp/output 

这样每个主机的标准输出将不适合单个缓冲区?在这种情况下,数据 文件[1-3] .txt的完整性,而不是顺序,将保持吗? 有可能是其他文件的文件片段在这样的其他文件的中间 中滑动?

 
[file1_fragment1] [file2_fragment1] [file1_fragment2] [file1_fragment3] [file3_fragment1] ... 

回答

2

我会说,事情发生的可能性几乎100%;-)假设在网络上采取cat一个文件的时间很长。

数据将按照与接收到的大致相同的顺序写入本地系统上的/tmp/output。 shell不知道要保存来自ssh命令#2或#3的数据,直到#1中断为止,此外,它不知道文件1每次迭代结束的时间。

+0

因此,只有主机的缓冲区大小(或本地主机,如果本地主机的缓冲区大小较小)才能保持数据完整性?你从哪里获得缓冲区大小信息? – OTZ 2010-08-10 00:09:35

+0

不知道,尽管你可以轻松地运行一些测试来找出答案。 (创建一个由所有A组成的文件,所有B中另一个,所有C中另一个C的文件,并在你的例子中使用它)不过,它不仅取决于缓冲区的大小,有时在写入换行符时刷新数据,因此数据完整性只能在“逐行保证”的基础上进行。 – 2010-08-10 00:37:42

+0

当然..我写了我的实验,显示“数据完整性不保留在这种情况下”,但我点击了一个链接在页面上消除它。细节很有趣,特别是第一个4MB(来自一个远程的2MB,其他的2MB)在没有任何数据混合的情况下被收到。 – OTZ 2010-08-10 02:06:34