【问题标题】:Data integrity question when collecting STDOUTs from multiple remote hosts over SSH通过 SSH 从多个远程主机收集 STDOUT 时的数据完整性问题
【发布时间】:2010-08-09 23:55:15
【问题描述】:

假设您运行以下命令:

ssh $host1 '而 [ 1 ];睡一觉; echo "来自 $HOSTNAME 的你好";完成' > /tmp/输出 ssh $host2 '而 [ 1 ];睡一觉; echo "来自 $HOSTNAME 的你好";完成' >> /tmp/输出 ssh $host3 'while [ 1 ];睡一觉; echo "来自 $HOSTNAME 的你好";完成' >> /tmp/输出

然后输出将如下所示:

来自host1的你好 来自host2的你好 来自host3的你好 来自host1的你好 ...

但是如果我把它改成

ssh $host1 '而 [ 1 ];睡一觉;猫 /some/large/file1.txt;完成' > /tmp/输出 ssh $host2 '而 [ 1 ];睡一觉;猫 /some/large/file2.txt;完成' >> /tmp/输出 ssh $host3 'while [ 1 ];睡一觉;猫 /some/large/file3.txt;完成' >> /tmp/输出

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

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

【问题讨论】:

    标签: linux ssh buffer stdout data-integrity


    【解决方案1】:

    我想说这种情况发生的可能性几乎是 100% ;-) 假设通过网络处理 cat 一个文件所花费的时间很长。

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

    【讨论】:

    • 所以数据完整性只能保持到主机的缓冲区大小(或本地主机的缓冲区大小,如果本地主机的缓冲区大小更小)?您从哪里获得缓冲区大小信息?
    • 不知道,尽管您可以轻松运行一些测试来找出答案。 (制作一个包含所有 A、另一个所有 B、另一个所有 C 的文件并在您的示例中使用它们)但是,它不仅仅取决于缓冲区大小;有时,每当写入换行符时,数据就会被刷新,因此数据完整性只能逐行“保证”。
    • 当.. 我写了我的实验表明“在这种情况下没有保持数据完整性”,但是我点击了页面上的一个链接,消除了它。不过细节很有趣:特别是,前 4MB(来自一个远程的 2MB;来自另一个的 2MB)是在没有任何数据混合的情况下接收的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多