Inotify & Rsync - Não mova arquivos antes que o download seja concluído

1

Estou usando um site local que baixa arquivos para o meu servidor. Usando um daemon Inotify Estou ouvindo as alterações de arquivos em uma pasta específica (aquela para a qual estou baixando) e executando um script que move esses arquivos para outra pasta usando o rsync. No entanto, meu problema aqui é que o rsync move os arquivos antes que eles sejam completamente baixados, então eles estão em 0KB. Eu usei o mv antes, e o mv conseguiu esperar até que o download seja concluído antes de ser movido, mas eu precisei usar o rsync porque o mv não grava em pastas existentes e não vazias.

Alguma idéia?

Aqui está o meu script que é executado no inotify create:

#!/bin/sh

cd the_folder_which_is_watched_by_inotify

rsync -vh * /where_the_files_are_moved_to

echo "Files have been moved"
    
por PoTTii 25.05.2016 / 19:05

2 respostas

0

A razão pela qual o mv provavelmente funcionaria, é porque o arquivo realmente seria o mesmo arquivo . Portanto, o processo de upload seria gravado em um determinado inode, e o comando mv simplesmente atualiza a origem e os destinos para que o inode esteja em um local diferente. Mas qualquer programa com um identificador aberto para o arquivo poderá continuar trabalhando com esse inode, para que você possa mover o link para onde você quiser.

O que você pode fazer é usar a opção rsync --link-dest . Obter os caminhos certos é complicado , pois --link-dest precisa do caminho relativo para a origem na perspectiva do destino. Mas isso deve fazer com que o rsync crie hardlinks para o arquivo. Isso é tanto a origem quanto o destino devem linkar exatamente ao mesmo inode.

    
por 25.05.2016 / 19:24
0

Você deve configurar seu daemon inotify para iniciar o rsync somente nos eventos CLOSE_WRITE e MOVE_FROM/MOVE_TO combo.

Se você estiver ouvindo os eventos CREATE e / ou MODIFY , você terminará com o rsync chamado quando o arquivo estiver sendo gravado, o que levará a uma cópia corrompida / vazia.

    
por 25.05.2016 / 21:50