Copiando um arquivo que é gravado ao mesmo tempo

3

Esta questão relacionada não pode resolver meu problema exato, então estou escrevendo uma pergunta semelhante.

Meu cenário é o seguinte: um programa (executado pelo wine) grava em um arquivo com tamanho de 10 a 500 KB. Aproximadamente 1 KB de adição acontece em cada evento de gravação (linhas são adicionadas ao final do arquivo, nenhum outro método de escrita existe), o intervalo entre gravações é de microssegundos a 240 minutos. (Geralmente, o intervalo entre gravações é entre 3 e 10 minutos, mas as bordas de tempo mencionadas anteriormente são os limites teoricamente possíveis). Eu não posso modificar esse intervalo e é aleatório do ponto de vista do usuário. O intervalo de gravação é alterado, portanto, é possível que os eventos de gravação ABCD sejam os seguintes: A-B 60 min; B-C 5 seg; C-D 357.4 seg e assim por diante.

Eu quero copiar o arquivo a cada 25 a 30 minutos para editá-lo externamente (automaticamente, é claro).

Qual é a melhor solução que garante nenhuma condição de corrida será exibida? Eu não quero escrever um algoritmo de tempo, mas, se for necessário, posso fazer isso. Além disso, a cópia - edição externa poderia ser expandida para o intervalo de 1 dia, não mais. O vinho não me permite redirecionar a saída.

$ grep sda4 /etc/mtab
/dev/sda4 /foo xfs rw,relatime,attr2,delaylog,noquota 0 0

UPDATE

Eu não posso colaborar com o processo de escrita, e o arquivo em questão é um arquivo de texto puro estritamente formatado.

    
por WavKuFoo 04.01.2012 / 11:13

1 resposta

1

Não há nada que forneça garantias de que você não copiará uma "gravação parcial" (do ponto de vista do seu aplicativo) em todos os casos, seja em um deles:

  • colaboração com esse outro processo (por exemplo, um método para você informar a liberação e parar / reiniciar suas gravações)
  • usando um sistema "real" transacional (banco de dados) que permite tirar instantâneos / backups / dumps consistentes

Às vezes, isso pode ser contornado, se o arquivo em questão estiver estritamente formatado. O último registro, se o arquivo foi copiado enquanto gravações não-atômicas estavam em andamento, será inconsistente ou parcial, e seu aplicativo de processamento pode detectar isso, ou simplesmente ignorar o último registro sistematicamente.

(Mesmo se o aplicativo sempre gravar seus registros com uma única chamada write ou equivalente, pode acontecer que o aplicativo seja interrompido durante a chamada de gravação e que apenas parte da gravação tenha sido realmente processada.)

    
por 04.01.2012 / 11:43