Linux 通过SSH从多个远程主机收集STDOUT时的数据完整性问题

Linux 通过SSH从多个远程主机收集STDOUT时的数据完整性问题,linux,ssh,buffer,stdout,data-integrity,Linux,Ssh,Buffer,Stdout,Data Integrity,假设您运行以下命令: 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";

假设您运行以下命令:

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 ssh$host1'而[1];做睡眠1;回显“Hello from$HOSTNAME”;完成'>/tmp/output ssh$host2'而[1];做睡眠1;回显“Hello from$HOSTNAME”;完成'>>/tmp/output ssh$host3'而[1];做睡眠1;回显“Hello from$HOSTNAME”;完成'>>/tmp/output 然后,输出将如下所示:

Hello from host1 Hello from host2 Hello from host3 Hello from host1 ... 你好,1号旅社 你好,2号旅社 你好,3号旅社 你好,1号旅社 ... 但是如果我把它改成

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 ssh$host1'而[1];做睡眠1;cat/some/large/file1.txt;完成'>/tmp/output ssh$host2'而[1];做睡眠1;cat/some/large/file2.txt;完成'>>/tmp/output ssh$host3'而[1];做睡眠1;cat/some/large/file3.txt;完成'>>/tmp/output 这样每个主机的标准输出就不能装入单个缓冲区了?数据会不会 在这种情况下,是否要维护文件[1-3].txt的完整性,而不是顺序?是 有可能其他文件的文件片段在中间滑动。 像这样的其他文件

[file1_fragment1] [file2_fragment1] [file1_fragment2] [file1_fragment3] [file3_fragment1] ... [file1\u fragment1][file2\u fragment1][file1\u fragment2][file1\u fragment3][file3\u fragment1]。。。
我想说发生这种情况的可能性几乎是100%;-)假设通过网络传输一个文件所需的时间较长


数据将被写入本地系统上的
/tmp/output
,写入顺序与接收顺序大致相同。shell不知道如何保存来自ssh命令#2或#3的数据,直到出现中断#1,而且,它也不知道文件1每次迭代的结束点在哪里。

因此,数据完整性只会保持到主机的缓冲区大小(或者本地主机的,如果本地主机的缓冲区大小较小的话)?你从哪里得到缓冲区大小的信息?不知道,不过你可以很容易地运行一些测试来找出答案。(创建一个包含所有a、另一个B、另一个C的文件,并在示例中使用它们)但这不仅仅取决于缓冲区大小;有时,每当写入换行符时,数据都会被刷新,因此数据完整性只能逐行“保证”。。我写下了我的实验,表明“在这种情况下,数据完整性无法保持”,但我点击了页面上的一个链接,消除了它。不过细节还是很有趣的:特别是,第一个4MB(一个远程的2MB;另一个远程的2MB)是在没有任何数据混合的情况下接收的。