Почему не обновить уведомление? - PullRequest
2 голосов
/ 20 октября 2011

Я пишу наблюдатель inotify на C для сервера Minecraft. По сути, он просматривает server.log, получает последнюю строку, анализирует ее и, если она соответствует регулярному выражению; выполняет некоторые действия.

Программа нормально работает через "строку эха, соответствующую регулярному выражению >> server.log", она анализирует и делает то, что должна. Однако, когда строка записывается в файл автоматически через сервер Minecraft, она не работает, пока я не выключу сервер или (иногда) не выйду из системы.

Я бы опубликовал код, но мне интересно, не имеет ли он никакого отношения к сбросу данных ext4 на диск или что-то в этом роде; проблема файловой системы. Было бы странно, если бы это было так, потому что "tail -f server.log" обновляется всякий раз, когда файл это делает.

Ответы [ 3 ]

3 голосов
/ 21 октября 2011

Решил мою собственную проблему. Оказалось, что сервер записывал в файл журнала быстрее, чем наблюдатель мог прочитать из него; поэтому наблюдатель вышел из синхронизации.

Я исправил это, добавив проверку после того, как он обрабатывает событие, говоря: «если число строк в текущем файле журнала превышает записанную длину журнала, обработайте файл до тех пор, пока они не станут равными».

Спасибо за вашу помощь!

1 голос
/ 20 октября 2011

Предположительно, это потому, что вы наблюдаете за событиями IN_CLOSE, которые могут не произойти, пока сервер не выключится (и не закроет дескриптор файла журнала). См. man inotify (7) для получения правильных параметров маски для вызова inotify_add_watch(). Я ожидаю, что вы захотите использовать IN_WRITE.

0 голосов
/ 20 октября 2011

Ваша теория, скорее всего, верна, файл журнала буферизируется операционной системой, и средство записи журнала не очищает этот буфер, поэтому все будет оставаться в буфере до тех пор, пока файл не будет закрыт или буфер не заполнится. Быстрый способ проверки состоит в том, чтобы запустить журнал до того момента, когда вы знаете, что он записал бы события в журнал, а затем принудительно закрыть его, чтобы он не мог закрыть дескриптор, если журнал пуст - это определенно буфер. Если вы можете получить дескриптор файла / дескриптор, вы можете использовать setbuf для удаления буферизации за счет производительности.

...