Question

J'écris un veilleur inotify en C pour un serveur Minecraft. En gros, il regarde server.log, obtient la dernière ligne, parse, et si elle correspond à une expression régulière; exécute certaines actions.

Le programme fonctionne très bien normalement par « chaîne d'écho correspondant à l'expression rationnelle >> server.log », il analyse et fait ce qu'il faut. Cependant, lorsque la chaîne est écrite dans le fichier automatiquement via le serveur Minecraft, il ne fonctionne pas jusqu'à ce que je ferme le serveur ou (parfois) déconnecter.

Je le code poster, mais je me demande si elle n'a pas quelque chose à voir avec les données de rinçage ext4 sur le disque ou quelque chose dans ce sens; un problème de système de fichiers. Il serait étrange si tel était le cas cependant, parce que les mises à jour « de server.log de queue » chaque fois que le fichier fait.

Était-ce utile?

La solution

Résolu mon propre problème. Il est avéré que le serveur a été écrit dans le fichier journal plus rapide que le veilleur peut lire de lui; de sorte que le veilleur était de sortir de la synchronisation.

Je l'ai fixé en ajoutant un contrôle après traitement de l'événement en disant: « si le nombre de lignes actuellement dans le fichier journal est plus que la longueur enregistrée du journal, reconditionner le fichier jusqu'à ce que les deux sont égaux. »

Merci pour votre aide!

Autres conseils

On peut supposer que parce que vous êtes en train de regarder pour des événements IN_CLOSE, qui ne peut se produire jusqu'à ce que le serveur se ferme vers le bas (et ferme le descripteur de fichier journal). Voir homme inotify (7) pour les paramètres de masque valides pour l'appel inotify_add_watch(). Je vous attends aurez envie d'utiliser IN_WRITE.

Votre théorie est plus que probable que correcte, le fichier journal est tamponné par le système d'exploitation, et l'auteur du journal n'a pas de rinçage de ce tampon, donc tout va rester dans la mémoire tampon jusqu'à ce que le fichier est fermé ou le tampon est plein. Un moyen rapide de test est de démarrer le journal au point où vous savez qu'il aurait des événements par écrit dans le journal, puis le fermer de force donc il ne peut pas fermer la poignée, si le journal est vide est definitly le tampon. Si vous pouvez mettre la main sur le fichier poignée / descripteur, vous pouvez utiliser setbuf pour enlever en mémoire tampon, au détriment de la performance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top