如何在程序运行时动态修改它的参数(状态)?

如题,有一个后台运行的Daemon程序,想动态调整它的参数如日志级别、限速大小等,大家都是怎么做的?

已邀请:

wk3368

赞同来自: astaxie

https://github.com/fsnotify/fsnotify 可以用这个库 talk is cheap,show you the code!

//启动配置文件监视,如有变化,自动加载
    watcher := DetectConfFileModify()
    defer watcher.Close()

// DetectConfFileModify 配置文件监视和敏感词库,如有变化,自动加载
func DetectConfFileModify() *fsnotify.Watcher {
    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        glog.Errorln(err.Error())
    }

    go func() { // Process fsnotify events
        timer := time.NewTimer(time.Second)
        timer.Stop()
        reloadingConf := false
        for {
            select {
            case ev := <-watcher.Event:
                switch ev.Name {
                case "conf/conf.json":
                    if !reloadingConf {
                        glog.Warningf("Reloading conf.json...")
                        reloadingConf = true
                        timer.Reset(time.Second)
                    }
                }
            case err := <-watcher.Error:
                glog.Errorln("error:", err)
            case <-timer.C:
                if reloadingConf {
                    err := global.LoadConf()
                    if err != nil {
                        glog.Errorf("Reloading conf.json error: %v", err)
                    } else {
                        glog.Warningf("Reloading conf.json done.")
                    }
                    reloadingConf = false
                }
            }
        }
    }()

    if err = watcher.Watch("conf/"); err != nil {
        glog.Errorln(err)
    }
    return watcher
}

sryan - backmir

赞同来自:

最简单的方法可能就是开一个http接口

ahjdzx

赞同来自:

通过设置信号刷配置,前提要做到配置可刷。

xkey - go

赞同来自:

这个问题可以使用各种姿势搞定,记住需要动态变化的参数使用atomic来修改,保证原子性操作: 1、开个http接口,通过发起http请求修改,此方法简单粗暴,缺点:一般后台程序无需http的 2、将参数写到配置文件,通过fsnotify来监听配置文件的变化(此包在windows下可能不好使),此种方法有缺点,就是任何参数变化都需要重新读取整个文件,做不到定制化 3、类etcd的watcher,程序中监听参数是否变化,出现变动更新即可,此方案个人认为最佳

stirlingx - https://github.com/liyue201

赞同来自:

要回复问题请先登录注册