このような状況を想像してみましょう。
while true
ファイルには、繰り返し間のスリープモードなしでループ内で連続してテキストが追加されます。
while true
do
echo "foo" >> source.file
done
ファイルを別の場所にコピーするには、別のプロセスを開始してくださいcp
。rsync
ファイルが特定のサイズ(コピープロセスの開始時にソースファイルのサイズと推測)にコピーされ、コピープロセスが終了することを確認しました。
コピープロセスの実行中にファイルサイズが増え続けるので、いつコピーを停止する必要があるかをどうやって知ることができますか?
答え1
この問題は、サイズが27バイト()にすぎないファイルをコピーしたときに発生しますstrace cp a b
。
read(3, "Who\222s there?\nIt's just me!\n", 131072) = 27
write(4, "Who\222s there?\nIt's just me!\n", 27) = 27
read(3, "", 131072) = 0
サイズは既知ですがcp
(コピー中は変更されません)、cp
最大128Kのデータを読み取ろうとします。 aにread()
0バイトが渡されると、コピーは停止します。これはファイルの終わりに達したことを示す信号です。
レプリケーションプロセスがデータを書き込むよりもデータを読み取るのが遅い場合(たとえば、他のI / O優先順位やcgroupsコントローラなどの他のI / O制約のため)、レプリケーションは「永久に」停止します。