Pergunta

Eu estou arquivando um diretório. Este diretório tem um arquivo que está sendo escrito por outro processo. Quando eu tar isso usando módulo tar Linux / Perl Tar, na arquivar a entrada para o arquivo está lá, mas o conteúdo é nulo.

Antes de asfaltamento os arquivos são ...

-rw-r--r--  1 irraju dba 28 Feb 18 02:22 a
-rw-r--r--  1 irraju dba 25 Feb 18 02:23 b
-rw-r--r--  1 irraju dba 29 Feb 18 03:38 c

Depois de untarring

-rw-r--r-- irraju/dba       28 2009-02-18 02:22:58 a
-rw-r--r-- irraju/dba       25 2009-02-18 02:23:17 b
-rw-r--r-- irraju/dba        0 2009-02-18 03:33:12 c

Como posso resolver este problema? Eu quero que o arquivo seja no arquivo com o conteúdo que tem no instante em que é arquivados. Este arquivo pode ser um arquivo de log e assumir que não podemos fechar o identificador de arquivo antes de asfaltamento.

Foi útil?

Solução

Como você marcou a questão com "Linux" há uma chance de que você está usando uma partição LVM. Se de fato você está correndo em uma partição LVM, você pode usar o recurso LVM instantâneo.

Aqui está um link para o LVM documentação relevante sobre como realizar a operação .

Aqui está uma parte do LVM instantâneo introdução :

A facilidade maravilhosa fornecidos pela LVM é 'instantâneos'. Isso permite que o administrador para criar um novo dispositivo de bloco que apresenta uma cópia exata de um volume lógico, congelado em algum momento no tempo. Normalmente, isso seria usado quando algum processamento em lote, uma cópia de segurança, por exemplo, precisa ser executada no volume lógico, mas você não quer parar um sistema vivo que está mudando os dados. Quando o dispositivo de snapshot foi finalizado com o administrador do sistema pode simplesmente remover o dispositivo. Esta facilidade requer que o snapshot ser feito num momento em que os dados sobre o volume lógico está em um estado consistente - o patch VFS-lock para LVM1 garante que alguns sistemas de arquivos fazem isso automaticamente quando um instantâneo é criado, e muitos dos sistemas de arquivos no kernel 2.6 fazer isso automaticamente quando um instantâneo é criado sem aplicação de patches.

Outras dicas

Tente copiar os arquivos primeiro ...

cp a a.tmp
cp b b.tmp
cp c c.tmp

... então tarball tudo junto ...

tar *.tmp abc.tar

... e limpo-se:

rm *.tmp

Se isso não funcionar, então o processo segurando o identificador de arquivo não quer compartilhar o acesso de leitura ...

Você pode achar que isso depende do sistema de arquivos usado e o aplicativo que está acessando o arquivo. O mais próximo de uma solução genérica é usar um sistema de arquivos que suporta instantâneos e criar um instantâneo antes de executar alcatrão.

A sua segunda saída é feita após seu primeiro, que não pode estar certo. Eu estou supondo que tar está aqui: quando foi fazer o seu trabalho, o arquivo estava vazio. Você pode estar lidando com uma condição de corrida aqui.

Como já foi dito, isso depende do sistema de arquivos e sistema operativo utilizado. sync primeira (ou qualquer que seja o equivalente está em seu sistema de arquivos), copiar os arquivos para um diretório temporário e, em seguida, tar-los. Se o sistema de arquivos não irá permitir que você copiar um arquivo aberto, então você está SOL; Perl não pode contornar as limitações do sistema de arquivos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top