在不停止程序的情况下,通过发送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 echokestty命令中的^代表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.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