Como o “cp” lida com arquivos abertos?

14

Estou tendo dois diretórios separados. O usuário carrega um arquivo no primeiro. Há um cronjob rodando em segundo plano que copia os arquivos a cada 5 minutos para o segundo diretório.

O que acontece se o usuário não tiver concluído seu upload e o cronjob copiar os arquivos? Note que os dois diretórios são de propriedade de usuários diferentes, o cronjob é executado como root.

    
por Stuffy 10.10.2012 / 14:38

3 respostas

15

cp não sabe sobre arquivos abertos. Portanto, se o primeiro usuário fizer o upload de um arquivo grande e o cronjob (ou qualquer outro processo) começar a copiar esse arquivo, ele só copiará tanto quanto já foi gravado. Você pode pensar sobre isso desta forma - cp faz uma cópia do que está atualmente no disco, não importa se o arquivo está completo. Caso contrário, você não pode copiar arquivos de log, por exemplo.

    
por 10.10.2012 / 14:52
7

cp não sabe quais outros programas podem ter os arquivos abertos. Não há mágica em cp . O design do unix propositadamente evita colocar qualquer tipo de travamento nos arquivos, a menos que exista uma razão convincente (o que significa que o kernel precisa disso). Sobre este tópico, consulte Faz redirecionando a saída para um arquivo aplicar um bloqueio no arquivo?

Tais situações, em que um arquivo é produzido por um produtor e, uma vez concluído, consumido por um consumidor, são comuns. A maneira usual de lidar com isso é fazer com que o produtor grave um arquivo temporário que o consumidor não irá procurar, e assim que o produtor terminar, mova o arquivo para um local onde o consumidor o encontre. Mover um arquivo (no mesmo sistema de arquivos) é uma operação atômica: em algum momento, para o consumidor, o arquivo muda de não estar lá para estar lá.

Portanto, organize seu trabalho de upload para mover os arquivos para um diretório diferente quando terminar de fazer o upload. Aponte a tarefa cron neste diretório diferente.

    
por 11.10.2012 / 02:50
6

Parece que você quer fazer um trabalho de sincronização dir.

Porque a opção -u, --update de cp

copy only when the SOURCE file is newer than the destination file or when the destination file is missing

Assim, você pode adicionar um cronjob como cp -auv SOURCEDIR/* DESTDIR , que copiará os arquivos cuja hora de modificação foi alterada. Isso significa que DESTDIR acabará recebendo a cópia completa enquanto o upload estiver concluído.

rsync pode fazer o mesmo trabalho. por exemplo, rsync -av SOURCEDIR/ DESTDIR .

Embora uma opção -a seja aplicada, alguns atributos especificados (por exemplo, propriedade) só podem ser preservados pelo superusuário.

Veja man cp , man rsync para detalhes.

    
por 11.10.2012 / 04:48

Tags