Por que não iNotify atualização?
-
27-10-2019 - |
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.
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.