2010-08-09 1 views
0

Предположит, что вы выполните следующие команды:целостность данных вопрос при сборе стандартных выводов из нескольких удаленных хостов через SSH

 
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 

так, чтобы stdout с каждого хоста не вписывался в один буфер? Были ли сохранены данные целостности файла [1-3] .txt, а не порядок? Есть Есть ли вероятность, что фрагмент файла какого-либо другого файла проскальзывает в середине какого-либо другого файла?

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

ответ

2

Я бы сказал, что вероятность, что происходит в значительной степени 100% ;-) предполагая, что время, затраченное на cat один файл по сети давно.

Данные будут записаны в /tmp/output по локальной системе примерно в том же порядке, в каком они получены. Оболочка не знает, чтобы держаться за данные, поступающие из команды ssh # 2 или # 3, до тех пор, пока не будет разрыв в # 1, и, кроме того, он не будет знать, где заканчивается конец каждой итерации файла 1.

+0

Таким образом, целостность данных поддерживается только до размера буфера хоста (или локального хоста, если размер буфера локального хоста меньше)? Где вы получаете информацию о размере буфера? – OTZ

+0

Не знаю, хотя вы можете легко запустить некоторые тесты, чтобы узнать. (Сделайте файл, состоящий из всех A, другого из всех B, другого из всех C и используйте их в вашем примере). Это зависит не только от размера буфера; иногда данные сбрасываются всякий раз, когда записывается новая строка, поэтому целостность данных «гарантируется» только по очереди. –

+0

Dang .. Я написал свой эксперимент, в котором показано, что «целостность данных в этом случае не сохраняется», но я нажал ссылку на странице, которая устранила ее. Детали были интересными: в частности, первые 4 МБ (2 МБ с одного пульта, 2 МБ от другого) были получены без какого-либо смешивания данных. – OTZ