classifica um arquivo no lugar enquanto ainda está escrevendo nele

3

Este parece ser um problema bastante comum e provavelmente é uma duplicata, mas não encontrei nenhuma outra pergunta semelhante.

Eu tenho algo parecido com um arquivo de log que eu adiciono, mas também quero mantê-lo classificado, então eu tenho algo assim:

echo "foo" >> file.txt
LC_ALL=C sort -k1,1 -u -o file.txt file.txt

É um arquivo muito pequeno (< 1000 linhas), portanto, a redação e a classificação devem ser muito rápidas. No entanto, às vezes eu tenho talvez 5 eventos por segundo, mas alguns deles se perdem. Fiquei muito surpreso ao ver esse problema com uma aplicação de taxa de transferência tão baixa.

Anexar ao arquivo deve funcionar sempre, então é provavelmente a classificação em que o problema acontece. Eu pensei que -o (escrever resultado para FILE em vez de saída padrão) cuidaria dos problemas de simultaneidade, mas talvez não.

Existe uma maneira correta de classificar um arquivo se um processo diferente puder ser escrito nele?

    
por burger 05.05.2017 / 20:16

1 resposta

0

Olhando para a implementação de sort que eu tenho acesso mais fácil (OpenBSD's), parece que você perderia dados se o arquivo de entrada fosse anexado entre

  • o utilitário sort terminou de ler os dados do arquivo de entrada e começou a classificação real e
  • o utilitário sort renomeando seu arquivo de saída temporário para o nome do arquivo de saída real (fornecido pelo argumento -o ) antes de sair.

Eu não consigo ver uma maneira de evitar isso, a não ser parar temporariamente qualquer processo de gravação no arquivo antes de classificá-lo e, em seguida, iniciá-lo novamente quando a classificação estiver concluída. Isso pode ser feito com kill -STOP e kill -CONT , respectivamente.

O processo de gravação no arquivo precisará abri-lo para gravação novamente, do contrário, ele gravaria em um arquivo que não está mais na estrutura de diretórios (desde que foi substituído). O GNU sort parece substituir o conteúdo do arquivo original pelos dados classificados, portanto, isso não é um problema.

    
por 05.05.2017 / 20:42

Tags