Estou tendo dois diretórios separados. O usuário carrega um arquivo no primeiro. Existe um cronjob em execução 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 o upload e o cronjob copiar os arquivos? Observe que os dois diretórios pertencem a usuários diferentes, o cronjob é executado como raiz.
cp
, não esperará até o upload completo do arquivo. Como esperamos que a taxa de transferência de rede seja mais baixa do que apenas copiar o arquivo de um local para outro dentro do mesmo host, em algum momentocp
atingirá o final do arquivo atual e interromperá a cópia. A solução para o seu problema pode ser simples: primeiro, o usuário carrega o arquivo com algum nome de arquivo especialmente desconectado (por exemplo, anexado com.
(ponto)). Quando a transferência é concluída, o usuário o renomeia para o nome original. para os arquivos que não estão iniciando.
..Respostas:
cp
não sabe sobre arquivos abertos. Portanto, se o primeiro usuário enviar um arquivo grande e o cronjob (ou qualquer outro processo) começar a copiar esse arquivo, ele copiará apenas o que já foi gravado. Você pode pensar sobre isso desta maneira -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 poderá copiar os arquivos de log, por exemplo.fonte
fuser
+cp
. Essa cópia seria realmente pouco confiável. Não copiará nenhum arquivo que seja aberto no editor de texto, por exemplo.lsof
? A saída disso deve ser fácil de processar. Você pode filtrar os arquivos que estão sendo abertos (digamos, por uma instância decp
) para gravação.fuser
claro), pois essa ferramenta pode não mostrar todos os arquivos.cp
não sabe quais outros programas podem ter os arquivos abertos. Não há mágicacp
. O design do unix evita propositalmente colocar qualquer tipo de bloqueio nos arquivos, a menos que haja um motivo convincente (o que significa que o kernel precisa dele). Neste tópico, consulte O redirecionamento de saída para um arquivo aplica 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 procurará; depois 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 o trabalho cron para esse diretório diferente.
fonte
Parece que você deseja fazer um trabalho de sincronização de diretório.
Porque a opção -u, --update de
cp
Portanto, você pode adicionar um cronjob como o
cp -auv SOURCEDIR/* DESTDIR
que copiará os arquivos cuja hora de modificação foi alterada. Isso significaDESTDIR
que, eventualmente, obterá a cópia completa enquanto o upload terminar.rsync
pode fazer o mesmo trabalho. por exemplorsync -av SOURCEDIR/ DESTDIR
,.Embora a 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.fonte