Usando wc em um arquivo enquanto ele é usado por outro programa

1

Estou gerando um arquivo de texto que, no final, conterá aproximadamente um bilhão de entradas. O arquivo é gerado por um programa que grava a ele a cada dois segundos. Para isso, ele sempre abre o arquivo e, em seguida, o fecha, portanto, o arquivo não é mantido aberto no modo de gravação o tempo todo. Como todo esse processo leva muito tempo, eu gostaria de executar 'wc -l < file_name 'para ver quantas entradas já existem (uma entrada = uma linha).

Mas eu estou querendo saber é se isso é uma má idéia? Como o wc precisa de alguns minutos para contar todas as linhas, ele lê o arquivo enquanto meu programa grava nele. Eu não me importo se houver pequenas discrepâncias entre o número de linhas contadas por wc e o número real de linhas. É mais que estou preocupado que meu programa não consiga gravar os dados no arquivo.

Isso pode acontecer no meu sistema Linux?

    
por Gregor 06.01.2014 / 10:04

2 respostas

2

Isso geralmente é realizado por meio de bloqueios . Existem dois tipos de bloqueios no Linux, consultivos e obrigatórios.

Bloqueios de consultoria exigem cooperação entre processos concorrentes, ie , que cada processo primeiro verifica se existe um bloqueio no arquivo, então age de acordo com sua existência (= espera) ou inexistência (= leitura /escrever). Em vez disso, o bloqueio obrigatório fornece a um processo a autoridade para impedir que os outros processos atuem no arquivo bloqueado.

Você não informou que tipo de processo está gravando em seu arquivo grande, por isso não sei qual dessas duas alternativas é mais adequada. Eu posso sugerir uma boa Introdução ao tópico, por falta de mais informações.

    
por 06.01.2014 / 10:23
1

Eu não sou um especialista nos detalhes de como as alças de arquivos são gerenciadas, mas na minha cabeça não vi razão para ter um problema aqui. Enquanto o programA estiver escrevendo e o programaB estiver lendo , não deverá haver problemas.

Embora você possa, obviamente, ter resultados inconsistentes na saída wc , não vejo como você pode ter dados corrompidos gravados no arquivo apenas porque você os leu. Se você tivesse dois programas escrevendo para o mesmo arquivo, isso seria um assunto diferente.

Portanto, os bloqueios são, de fato, a melhor maneira de lidar com o acesso a arquivos sobrepostos, mas eles não devem ser necessários se tudo o que você estiver fazendo for usar wc para monitorar o progresso. Eu fiz o mesmo milhares de vezes sem nenhum problema. Você pode, no entanto, considerar a adição de uma impressão do medidor de progresso ao erro padrão em seu script ou a utilização de tail -f no arquivo gerado.

    
por 06.01.2014 / 11:07