Pergunta

Eu estou escrevendo um observador inotify em C para um servidor de Minecraft. Basicamente, relógios server.log, obtém o mais recente linha, analisa-lo, e se ele corresponde a regex; executa algumas ações.

O programa funciona bem normalmente através "string eco correspondente ao regex >> server.log", ele analisa e faz o que deveria. No entanto, quando a corda é escrito para o arquivo automaticamente através do servidor de Minecraft, ele não funciona até que eu desligar o servidor ou (às vezes) logout.

Eu ia postar código, mas eu estou querendo saber se ele não tem algo a ver com ext4 esvaziando dados em disco ou algo nesse sentido; um problema do sistema de arquivos. Seria estranho se fosse esse o caso, porém, porque as atualizações "tail -f Server.log" sempre que o arquivo faz.

Foi útil?

Solução

resolveu o meu próprio problema. Descobriu-se o servidor estava escrevendo para o arquivo de log mais rápido do que o observador pode ler a partir dele; de modo que o observador estava ficando fora de sincronia.

Eu fixo-lo adicionando um cheque depois que processa o evento dizendo que "se o número de linhas atualmente no arquivo de log é mais do que o comprimento gravado do log, reprocessar o arquivo até que os dois são iguais."

Obrigado por sua ajuda!

Outras dicas

Provavelmente isso é porque você está assistindo para eventos IN_CLOSE, o que não pode ocorrer até que as fecha servidor para baixo (e fecha o identificador de arquivo de log). Consulte homem inotify (7) para os parâmetros de máscara válidos para a chamada inotify_add_watch(). Eu espero que você vai querer usar IN_WRITE.

A sua teoria é mais do que provável correto, o arquivo de log está sendo tamponado pelo sistema operacional, eo escritor log não tem rubor que buffer, de modo que tudo permanecerá no buffer até que o arquivo é fechado ou o buffer está cheio. Uma maneira rápida de teste é para iniciar o log até o ponto onde você sabe que teria escrito eventos para o log, em seguida, à força perto dele para que ele não pode fechar o punho, se o log está vazio é Sem dúvida o buffer. Se você pode se apossar do identificador de arquivo / descritor, você pode usar setbuf para remover o buffer, ao custo de desempenho.

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