Вопрос целостности данных при сборе STDOUT с нескольких удаленных хостов через 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

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

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

person OTZ    schedule 09.08.2010    source источник


Ответы (1)


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

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

person David Z    schedule 10.08.2010
comment
Таким образом, целостность данных поддерживается только до любого размера буфера хоста (или локального хоста, если размер буфера локального хоста меньше)? Откуда вы берете информацию о размере буфера? - person OTZ; 10.08.2010
comment
Понятия не имею, хотя вы могли бы легко провести несколько тестов, чтобы выяснить это. (Создайте файл, состоящий из всех A, еще один из всех B, еще один из всех C, и используйте их в своем примере). Однако это зависит не только от размера буфера; иногда данные сбрасываются всякий раз, когда записывается новая строка, поэтому целостность данных гарантируется только на построчной основе. - person David Z; 10.08.2010
comment
Черт... Я описал свой эксперимент, показывающий, что в этом случае целостность данных не сохраняется, но я щелкнул ссылку на странице, которая устранила его. Хотя подробности были интересны: в частности, первые 4Мб (2Мб с одного пульта, 2Мб с другого) были получены без смешивания данных. - person OTZ; 10.08.2010