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")
发布评论