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

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

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

做了个例子,效果如下。

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

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

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

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

[email protected]:~$ 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
[email protected]:~$ 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

时间: 2024-09-29 05:17:25

热更新配置参数例子(Golang)的相关文章

(十四)配置的热更新

这一节演示下配置的热更新,即不用重启网站,更改配置文件的信息,网站也能同步更改.还是继续沿用OptionsBindSample 实现也比较简单,改下Index.cshtml 1 @using Microsoft.Extensions.Options 2 @inject IOptionsSnapshot<OptionsBindSample.Class> ClassAccesser //原来的IOptions改成IOptionsSnapshot 3 @{ 4 ViewData["Titl

2.4配置的热更新「深入浅出ASP.NET Core系列」

希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 大家知道通常我们修改网站的配置文件比如,webconfig的时候,网站需要重启才能读取到最新的修改,所谓热更新就是网站无需重启,修改完配置文件,直接F5就可以看到效果如下图所示: 修改IOption为IOptionsSnapshot 上一节当中我们使用IOption来作为注入,这次我们改成IOptionSnapshot,注意如果我们是在Controller里也是一样的,见下图 修改为IOptionsSnapsh

Idea maven tomcat 配置热更新 以及 maven jar依赖

看了视频 实在忍不住上了idea的贼船 不过这玩意确实有点坑爹,因为用的人少,所以很多配置是有问题的 例如maven配置tomcat热更新 以及tomcat的maven配置 我这里放几张图作为备用 配置maven web项目跟tomcat的时候一定要选这个按钮进去 然后把一些maven的依赖,全部添加到tomcat,否则tomcat会找不到jar包,然后在web运行的时候报错,启动的时候是不会出现错误的 我这里已经把maven依赖添加进去了,所以不会有问题,右侧已经没有elements这个列表选

JVM内存配置参数-XMX,-XMS,-XMN的例子

转载:http://www.nowcoder.com/questionTerminal/093bfa948d144ce3b0a68b938ae8b4ec 对于JVM内存配置参数: -Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3 ,其最小内存值和Survivor区总大小分别是() 5120m,1024m 5120m,2048m 10240m,1024m 10240m,2048m D -Xms10240m 初始堆大小即最小内存值 XXSurviv

谁偷了我的热更新?Mono,JIT,IOS

前言 由于匹夫本人是做游戏开发工作的,所以平时也会加一些玩家的群.而一些困扰玩家的问题,同样也困扰着我们这些手机游戏开发者.这不最近匹夫看自己加的一些群,常常会有人问为啥这个游戏一更新就要重新下载,而不能游戏内更新呢?作为游戏开发者,或者说Unity3D程序猿,我们都清楚Unity3D不支持热更新,甚至于在IOS平台上生成新的代码都会导致游戏报错崩溃(匹夫之所以在此处强调生成新的代码这几个字,就是提醒各位不要混淆Reflection.Emit和反射).但我们是否和普通的玩家一样,看到的仅仅是“不

Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(下篇——多页面VueSSR+热更新Server)

Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(下篇--多页面VueSSR+热更新Server) @(HTML/JS) 这是Vue多页面框架系列文章的第二篇,上一篇(纯前端Vue多页面)中,我们尝试从webpack-simple原型项目改造为一个多页面的Vue项目.而这里,我们继续往前,尝试把Vue多页面改造为Nodejs直出.由于步骤较多,所以本文片幅较长. 本文源代码:https://github.com/kenkozheng/HTML5_research/tr

手游热更新方案--Unity3D下的CsToLua技术

WeTest 导读 CsToLua工具将客户端 C#源码自动转换为Lua,实现热更新,本文以麻将项目为例介绍客户端技术细节. 麻将项目架构 其中ChinaMahjong-CSLua为C#工程,实现麻将项目的主要业务流程.翻译工程的输入是C#项目生成的dll文件.其中Cecil负责分析类型 类成员关系 ,比如类字段函数结构,引用关系.类之间的继承关系等,ILSpy负责反编译函数体里的语句,比如条件语句,函数调用,算数运算等.下面逐个介绍具体的实现. Mono.Cecil Mono.Cecil:一个

关于ntp时间同步理论及配置参数-20170804

[原创]关于ntp时间同步理论及配置参数20170804 前言 NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议.无论是平时使用的私人计算机还是在工作中搭建的服务器集群,时间的统一性和准确性是十分重要的.它是用来同步网络中各个计算机的时间的协议. 在计算机的世界里,时间非常地重要,例如对于火箭发射这种科研活动,对时间的统一性和准确性要求就非常地高,是按照A这台计算机的时间,还是按照B这台计算机的时间?NTP就是用来解决这个问题的,NT

unity 热更新 c# 实战经验分享(一)

demo 工程地址 :http://pan.baidu.com/s/1qWBYxqc 我们接上篇 内容继续讲 http://www.cnblogs.com/zyc-it/p/4820810.html (1)工程分离 什么叫工程分离呢,就是要把你的游戏包(后面简称 #主工程#),和你的热更新工程(后面简称 #热更新工程#) 分离开.首先我先说一下 ,我为什么要这么做: 原因:从github 上更新下来的 jsb的工程,把所有的热更新代码写在了unity 里面了,然后在 热更新工程里面 去引用这些c