背景:
更新配置檔案、更新server程式等,需要重啟伺服器,需要做到重啟伺服器時,伺服器不停止執行,請求不丟失
原理:熱重啟原理涉及到一些系統呼叫及父子程序之間檔案控制代碼的傳遞等較多細節,處理過程大致如下:
監聽訊號
收到 kill -1 訊號時, fork子程序(使用相同的啟動命令),將檔案描述符、環境引數等傳遞給子程序
這時父程序、子程序同時存在
子程序啟動後,父程序停止執行服務,停止接受請求,父程序等到舊鏈結、業務處理完成(或超時)
父程序退出,重啟完成
serve.go
package goo
import (
"fmt"
"log"
"os"
"os/signal"
"syscall"
type serve struct ,
if _, err := syscall.forkexec(os.args[0], os.args, execspec); err != nil {
log.fatalln(err.error())
this.shutdown = true
signal.stop(this.chansignal)
case syscall.sigkill, syscall.sigint:
this.shutdown = true
signal.stop(this.chansignal)
func (this *serve) pid() error {
file, err := os.create(".pid")
if err != nil {
return err
defer file.close()
file.writestring(fmt.sprintf("%d", os.getpid()))
return nil
func (this *serve) stop() {
os.exit(0)
main.go
package main
import (
"fmt"
"time"
"googo.co/goo"
var (
serve *goo.serve
func init() {
serve = goo.newserve()
func main() {
num := 0
c := make(chan string)
for {
num = num + 1
go syncarticle(c)
for {
msg :=
if msg == "end" {
if serve.shutdown {
serve.stop()
time.sleep(time.duration(config.idataapi.time) * time.minute)
break
fmt.println(time.now().format("2006-01-02 15:04:05"), num, msg)
exec go 重啟 如何用 Go 實現熱重啟
熱重啟 熱重啟 zero downtime 指新老程序無縫切換,在替換過程中可保持對 client 的服務。原理父程序監聽重啟訊號 在收到重啟訊號後,父程序呼叫 fork 同時傳遞 socket 描述符給子程序 子程序接收並監聽父程序傳遞的 socket 描述符 在子程序啟動成功之後,父程序停止接收...
nginx重啟 平滑重啟
進入 ngiinx sbin目錄下 nginx c usr local nginx conf nginx.conf c引數指定了要載入的nginx配置檔案路徑 停止操作 停止操作是通過向nginx程序傳送訊號來進行的 步驟1 查詢nginx主程序號 ps ef grep nginx在程序列表裡 面找...
nginx重啟 平滑重啟
進入 ngiinx sbin目錄下 nginx c usr local nginx conf nginx.conf c引數指定了要載入的nginx配置檔案路徑 停止操作 停止操作是通過向nginx程序傳送訊號來進行的 步驟1 查詢nginx主程序號 ps ef grep nginx 在程序列表裡 面...