Domanda

Sto scrivendo un watcher inotify in C per un server Minecraft.Fondamentalmente, controlla server.log, riceve l'ultima riga, la analizza e se corrisponde a una regex;esegue alcune azioni.

Il programma funziona normalmente tramite "echo string matching the regex >> server.log", analizza e fa quello che dovrebbe.Tuttavia, quando la stringa viene scritta automaticamente nel file tramite il server Minecraft, non funziona fino a quando non spengo il server o (a volte) esco.

Vorrei postare il codice, ma mi chiedo se non abbia qualcosa a che fare con ext4 che scarica i dati su disco o qualcosa del genere;un problema di filesystem.Sarebbe strano se fosse così, perché "tail -f server.log" si aggiorna ogni volta che lo fa il file.

È stato utile?

Soluzione

Ha risolto il mio problema.Si è scoperto che il server scriveva nel file di registro più velocemente di quanto il watcher potesse leggere da esso;quindi l'osservatore stava perdendo la sincronizzazione.

L'ho risolto aggiungendo un segno di spunta dopo che ha elaborato l'evento che dice "se il numero di righe attualmente nel file di registro è maggiore della lunghezza registrata del registro, rielabora il file fino a quando i due sono uguali."

Grazie per il tuo aiuto!

Altri suggerimenti

Presumibilmente ciò è dovuto al fatto che stai osservando gli eventi IN_CLOSE, che potrebbero non verificarsi fino a quando il server non si spegne (e chiude l'handle del file di registro).Vedi man inotify (7) per parametri di maschera validiper la chiamata inotify_add_watch().Mi aspetto che vorrai usare IN_WRITE.

La tua teoria è più che corretta, il file di log è stato memorizzato nel buffer dal sistema operativo e il writer di log non ha alcun svuotamento di quel buffer, quindi tutto rimarrà nel buffer fino a quando il file non viene chiuso o il buffer è pieno.Un modo veloce per testare è avviare il log fino al punto in cui sai che avrebbe scritto eventi nel log, quindi chiuderlo forzatamente in modo che non possa chiudere l'handle, se il log è vuoto è sicuramente il buffer.Se riesci a ottenere l'handle / descrittore del file, puoi utilizzare setbuf per rimuovere il buffering, a scapito delle prestazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top