热更新配置参数例子(Golang)

xcltapestry · · 4948 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

       在不停止程序的情况下,通过发送USR1或USR2等信号量,触发运行中程序的参数更新处理。当然还可以通过处理如kill等信号量,

让程序正确的处理退出操作。

     做了个例子,效果如下。 


   可以看到通过发出kill -USR1 id号 让对应的程序参数发生了变更。

    关于kill的参数值可以通过kill -l列出。 各个终端也提供了很多快捷键来支持特定信息的发送,如最常见的ctrl+c.

但注意,各个终端的快捷键定义可能不一样,而且有些是可以自定义的,这个要注意,在使用前可以用stty -a查出。

 附上测试机这两条命令的结果:    

xcl@xclpc:~$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	
xcl@xclpc:~$ stty -a
speed 38400 baud; rows 22; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
  stty命令中的^代表ctrl键.


附上Go语言的例子源码:

//热更新配置参数例子(Golang)
//author: Xiong Chuan Liang
//date: 2015-4-11

package main

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"
	"time"
)

var gConfig string

func main() {
	quit := make(chan bool)
	readConfig()
	go signals(quit)
	go displayConfig(quit)
EXIT:
	for {
		select {
		case <-quit:
			break EXIT
		default:
		}
	}
	fmt.Println("[main()]  exit")
}

func signals(q chan bool) bool {
	sigs := make(chan os.Signal)
	defer close(sigs)
EXIT:
	for {
		signal.Notify(sigs, syscall.SIGQUIT,
			syscall.SIGTERM,
			syscall.SIGINT,
			syscall.SIGUSR1,
			syscall.SIGUSR2)

		sig := <-sigs

		switch sig {
		case syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT:
			fmt.Println("[signals()] Interrupt...")
			break EXIT
		case syscall.SIGUSR1:
			fmt.Println("[signals()] syscall.SIGUSR1...")
			updateConfig()
		case syscall.SIGUSR2:
			fmt.Println("[signals()] syscall.SIGUSR2...")
			//updateVersion()
		default:
			break EXIT
		}
	}
	q <- true
	return true
}

func readConfig() {
	gConfig = "init"
	fmt.Println("[readConfig()] ", gConfig)
}

func updateConfig() {
	gConfig = "update"
	fmt.Println("[updateConfig()] ", gConfig)
}

func displayConfig(quit chan bool) {
	for {
		select {
		case <-quit:
			fmt.Println("[displayConfig()] exit")
			return
		default:
		}
		fmt.Println("[displayConfig()] Config:", gConfig)
		time.Sleep(time.Second * 2)
	}
}

BLOG: http://blog.csdn.net/xcl168




有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:xcltapestry

查看原文:热更新配置参数例子(Golang)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

4948 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传