Вопрос целостности данных при сборе STDOUT с нескольких удаленных хостов по SSH - PullRequest
0 голосов
/ 10 августа 2010

Предположим, вы выполняете следующие команды:

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] ...

1 Ответ

2 голосов
/ 10 августа 2010

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

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

...