基于inotify实现配置文件热更新
在上一篇文章《Go配置文件热加载 - 发送系统信号》中给大家介绍了在Go语言中 利用发送系统信号更新配置文件 其核心思想就是:新起一个协程,监听linux 的用户自定义信号 USR1 , 当收到该信号类型时,主动更新当前配置文件。 那么接下来,我们将继续完成上一篇文章提到的第二种实现配置文件热更新方式:利用linux提供的inotify 接口实现配置文件自动更新。 1. 关于inotify首先在我们实操之前,让我们先来了解下什么是 inotify。 在 Linux 内核 2.6.13 (June 18, 2005)版本之后,Linux 内核新增了一批文件系统的扩展接口(API),其中之一就是inotify,inotify 提供了一种基于 inode 的监控文件系统事件的机制,可以监控文件系统的变化如文件修改、新增、删除等,并可以将相应的事件通知给应用程序。 inotify 既可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录本身以及目录中的各文件的变化。此外,inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O操作 select、poll 和 epoll 来监视文件系统的变化。 总之,简单来说就是:inotify 为我们从系统层面提供了一种可以监控文件变化的接口,我们可以利用它来监控文件或目录的变化。 inotify常用监控事件inotify 提供常用的监控事件如下: IN_ACCESS 文件被访问时触发事件,例如一个文件正在被read时。 IN_ATTRIB 文件属性(Metadata)发送变化触发的事件,例如文件权限发生变化(使用 chmod 修改),文件所属用户发生变化(使用chown修改),文件时间戳发生变化等。 IN_CLOSE_WRITE 当一个文件写入操作结束文件被关闭时触发。 IN_CLOSE_NOWRITE 当一个文件或目录被打开没有任何写操作,当被关闭时触发。 IN_CREATE 当一个文件或目录被创建时触发。 IN_DELETE 文件或目录被删除时触发。 IN_DELETE_SELF 监控文件或目录本身被删除时触发,而且,如果一个文件或目录被移到其它地方,比如使用mv 命令,也会触发该事件,因为 mv 命令本质上是拷贝一份当前文件,然后删除当前文件的操作。 IN_MODIFY 文件被修改时触发,例如:有写操作( write) 或者文件内容被清空(truncate)操作。不过需要注意的是,IN_MODIFY 可能会连续触发多次。 IN_MOVE_SELF 所监控的文件或目录本身发生移动时触发。 IN_MOVED_FROM 文件或目录移除所监控目录。 IN_MOVED_TO 文件或目录移入所监控目录。 ...