Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top