Como o arquivo com tamanho continuamente crescente é copiado

1

Vamos imaginar essa situação:

Um arquivo está sendo anexado continuamente por texto em um loop while true sem suspensão entre iterações.

while true
do
echo "foo" >> source.file
done 

Outro processo é iniciado, o qual faz cp ou rsync do arquivo para outro local. Notei que o arquivo é copiado com tamanho específico (acho que o tamanho do arquivo de origem era no momento em que o processo de cópia foi iniciado) e, em seguida, o processo de cópia termina.

Como ele sabe quando parar de copiar, já que o tamanho do arquivo está aumentando continuamente durante a execução do processo de cópia?

    
por CuriousGuy 31.03.2018 / 20:17

1 resposta

1

Isso acontece quando você copia um arquivo com apenas 27 bytes ( strace cp a b ):

read(3, "Who2s there?\nIt's just me!\n", 131072) = 27
write(4, "Who2s there?\nIt's just me!\n", 27) = 27
read(3, "", 131072)                     = 0

Embora cp saiba o tamanho (e isso não muda durante a cópia) cp tenta ler até 128K de dados. Ele pára de copiar se um read() fornecer zero bytes. Esse é o sinal de que o final do arquivo é atingido.

Se o processo de cópia ler os dados mais lentamente do que está escrito (por exemplo, devido a diferentes prioridades de E / S ou outros limites de E / S como os controladores cgroups), a cópia "nunca" será interrompida.

    
por 31.03.2018 / 20:31