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

如题,有一个后台运行的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

赞同来自:

要回复问题请先登录注册