Movendo um arquivo para um arquivo que está sendo lido

10

Quando um arquivo é movido e o arquivo de destino já existe e está sendo lido no momento, a operação será bem-sucedida? Depende de quanto tempo dura a operação de leitura no arquivo de destino?

Desmond Hume
fonte

Respostas:

9

A operação de leitura será bem-sucedida, independentemente do tempo necessário para concluir a operação de leitura.

Por que e como isso funciona?

Quando a operação de leitura é iniciada, o Inode do arquivo é usado como um identificador a partir do qual o conteúdo do arquivo é lido.

Ao mover outro arquivo para o arquivo de destino, o resultado será um novo inode, o que significa que o conteúdo físico do arquivo no disco será colocado em outro lugar e o conteúdo original do arquivo que está sendo lido não será tocado.

A única coisa que eles têm em comum é o caminho / nome do arquivo, enquanto o inode subjacente e a localização phyiscal no disco são alterados.

Quando a operação de leitura terminar (dado que nenhum outro processo ainda possui um identificador de arquivo aberto no arquivo antigo e não há outros hardlinks referenciando seu inode), os dados antigos serão descartados.

Quando a operação de movimentação estiver concluída, o arquivo terá um novo número de índice de inode.

Você pode exibir o número do índice do inode dos arquivos usando ls -i /tmp/some-file.

Pelo mesmo motivo descrito acima, é possível excluir arquivos que ainda estão em uso por um aplicativo, pois os aplicativos que usam o arquivo apenas lêem do inode (apontando para o conteúdo real do arquivo no disco) enquanto a referência dos arquivos no sistema de arquivos é excluído.

Elias Probst
fonte
1
Você esqueceu de mencionar os links físicos: quando a operação de leitura terminar, se esse inode estiver vinculado a partir de outra entrada de diretório, os dados não serão removidos (porque ainda tem um nome).
Cjm 01/12/13
Obrigado por apontar isso, editei minha resposta e a adicionei.
Elias Probst