2024年4月2日发(作者:)

for {

sig := <-ch

("signal: %v", sig)

// timeout context for shutdown

ctx, _ := meout(ound(), 20*)

switch sig {

case , M:

// stop

("stop")

(ch)

wn(ctx)

("graceful shutdown")

return

case 2:

// reload

("reload")

err := reload()

if err != nil {

("graceful restart error: %v", err)

}

wn(ctx)

("graceful reload")

return

}

}

}

我的实现

package main

import (

"net"

"net/http"

"time"

"log"

"syscall"

"os"

"os/signal"

"context"

"fmt"

"os/exec"

"flag"

)

var (

listener er

err error

server

graceful = ("g", false, "listen on fd open 3 (internal use only)")

)

type MyHandler struct {

}

func (*MyHandler)ServeHTTP(w seWriter, r *t){

n("request start at ", (), +"?"+ry, "request done at ", (), " pid:", ())

(10 * )

([]byte("this is test response"))

n("request done at ", (), " pid:", () )

}

func main() {

()

n("start-up at " , (), *graceful)

if *graceful {

f := e(3, "")

listener, err = stener(f)

( "graceful-reborn %v %v %#v n", (), (), listener)

}else{

listener, err = ("tcp", ":1111")

tcp,_ := listener.(*tener)

fd,_ := ()

( "first-boot %v %v %#v n ", (),(), listener)

}

server := {

Handler: &MyHandler{},

ReadTimeout: 6 * ,

}

("Actual pid is %dn", ())

if err != nil {

println(err)

return

}

(" listener: %vn", listener)

go func(){//不要阻塞主进程

err := (listener)

if err != nil {

n(err)

}

}()

//signals

func(){

ch := make(chan , 1)

(ch, , M)

for{//阻塞主进程, 不停的监听系统信号

sig := <- ch

("signal: %v", sig)

ctx, _ := meout(ound(), 20*)

switch sig {

case M, :

println("signal cause reloading")

(ch)

{//fork new child process

tl, ok := listener.(*tener)

if !ok {

n("listener is not tcp listener")

return

}

currentFD, err := ()

if err != nil {

n("acquiring listener file failed")