我在C中为Minecraft服务器编写了一个inotify观察器。基本上,它监视server.log,获取最新行,解析它,如果它匹配正则表达式;执行一些操作。
该程序通常通过“匹配正则表达式>>> server.log”的回声字符串正常工作,它解析并做它应该做的事情。但是,当字符串通过Minecraft服务器自动写入文件时,在关闭服务器或(有时)注销之前它不起作用。
我会发布代码,但我想知道它是否与ext4将数据刷新到磁盘或某些东西没有关系;文件系统问题。如果是这种情况会很奇怪,因为“tail -f server.log”会在文件发生时更新。
答案 0 :(得分:3)
解决了我自己的问题。事实证明,服务器写入日志文件的速度比观察者可以读取的速度快;所以观察者不同步了。
我通过在处理事件后添加一个检查来修复它,“如果当前日志文件中的行数超过了记录的日志长度,则重新处理文件,直到两者相等。”
感谢您的帮助!
答案 1 :(得分:1)
大概是因为您正在关注IN_CLOSE
事件,这些事件可能在服务器关闭之前不会发生(并关闭日志文件句柄)。有关inotify_add_watch()
调用的有效掩码参数,请参阅man inotify(7)。我希望您能使用IN_WRITE
。
答案 2 :(得分:0)
您的理论很可能是正确的,日志文件正由OS缓冲,并且日志写入器没有刷新该缓冲区,因此一切都将保留在缓冲区中,直到文件关闭或缓冲区已满。一种快速的测试方法是将日志启动到您知道它会将事件写入日志的位置,然后强制关闭它以使其无法关闭句柄,如果日志为空则绝对是缓冲区。如果您可以获取文件句柄/描述符,则可以使用setbuf
来删除缓冲,但会牺牲性能。