linux 信号

当系统热重启时,服务不间断,系统内存中数据需要全部写入到数据库。

gracehttp

func (srv *Server) handleSignals() {
    var sig os.Signal

    signal.Notify(
        srv.signalChan,
        syscall.SIGTERM,
        syscall.SIGUSR2,
    )

    for {
        sig = <-srv.signalChan
        switch sig {
        case syscall.SIGTERM:
            srv.logf("received SIGTERM, graceful shutting down HTTP server.")
            srv.shutdownHTTPServer()
        case syscall.SIGUSR2:
            srv.logf("received SIGUSR2, graceful restarting HTTP server.")

            if pid, err := srv.startNewProcess(); err != nil {
                srv.logf("start new process failed: %v, continue serving.", err)
            } else {
                srv.logf("start new process successed, the new pid is %d.", pid)
                srv.shutdownHTTPServer()
            }
        default:
        }
    }
}

监听Linux信号,收到重启信号后,等待任务全部处理完再退出进程(因为使用了第三方包,它也在监听信号,它会在没有http请求后终止服务,所以这个不可行)
共享内存。这样多个进程都可以读取数据。

相关推荐