2010-08-09 104 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