2010-08-09 31 views
0

Supposons que vous exécutez les commandes suivantes:question de l'intégrité des données lors de la collecte STDOUTs à partir de plusieurs hôtes distants via 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 

Ensuite, la sortie ressemblerait à ceci:

 
Hello from host1 
Hello from host2 
Hello from host3 
Hello from host1 
... 

Mais si je l'ai changé

 
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 

de sorte que stdout de chaque hôte ne rentre pas dans un seul tampon? Est-ce que les données l'intégrité du fichier [1-3] .txt, et non l'ordre, être maintenu dans ce cas? Est-ce que il ya une possibilité qu'un fragment de fichier d'un autre fichier se glisse au milieu d'un autre fichier comme celui-ci?

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

Répondre

2

je dirais que la possibilité que cela se produise est à peu près 100% ;-) en supposant que le temps nécessaire pour cat un fichier sur le réseau est long.

Les données seront écrites sur /tmp/output sur le système local dans le même ordre que celui où elles ont été reçues. Le shell ne sait pas conserver les données provenant de la commande ssh # 2 ou # 3 jusqu'à ce qu'il y ait une pause dans # 1, et de plus, il n'aura aucune idée d'où vient la fin de chaque itération du fichier 1.

+0

L'intégrité des données est donc maintenue jusqu'à la taille de la mémoire tampon de l'hôte (ou localhost, si la taille de la mémoire tampon de l'hôte local est plus petite)? Où obtenez-vous l'information sur la taille de la mémoire tampon? – OTZ

+0

Aucune idée, même si vous pourriez facilement faire quelques tests pour le savoir. (Créez un fichier qui comprend tous les A, un autre de tous les B, un autre de tous les C et utilisez-les dans votre exemple) Cela dépend de plus que de la taille de la mémoire tampon; Parfois, les données sont vidées chaque fois qu'une nouvelle ligne est écrite, de sorte que l'intégrité des données est seulement "garantie" ligne par ligne. –

+0

Dang .. J'ai écrit mon expérience montrant que "l'intégrité des données n'est pas conservée dans ce cas", mais j'ai cliqué sur un lien sur la page qui l'a éliminé. Les détails étaient cependant intéressants: en particulier, les 4 premiers Mo (2 Mo d'une télécommande, 2 Mo d'autre) ont été reçus sans aucun mélange de données. – OTZ