【发布时间】:2019-12-01 15:17:36
【问题描述】:
我正在尝试编写代码,以便在收到信号时优雅地关闭 http 服务器。
我的代码有两个 go 例程 - signalHandler() 和 simpleServiceStarter() - 一个用于信号处理,另一个用于 http 服务器。收到信号后,处理程序应关闭 http 服务器
所以simpleServiceStarter() 从ListenAndServe() 中断。下面是我的代码。
package main
import (
"context"
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
var (
simpleHTTPServer http.Server
sigChan chan os.Signal
simpleServiceShutdown chan bool
)
func simpleServiceStarter() {
mux := http.NewServeMux()
simpleHTTPServer := &http.Server{
Addr: ":9000",
Handler: mux,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
fmt.Printf("\nstarting http server on :9000 ")
err := simpleHTTPServer.ListenAndServe()
if err != http.ErrServerClosed {
fmt.Printf("error starting simple service or closing listener - %v\n", err)
}
fmt.Printf("simple service http server shutdown completed - %v\n", err)
// communicate with main thread
simpleServiceShutdown <- true
}
func signalHandler() {
// Handle SIGINT and SIGHUP.
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGHUP)
sig := <-sigChan
fmt.Printf("\nsignalHandler() received signal: %v\n", sig)
// gracefully shutdown http server
err := simpleHTTPServer.Shutdown(context.Background())
fmt.Printf("simple service shutdown on signal %v, error: %v\n", sig, err)
close(sigChan)
}
func main() {
// block all async signals to this server. And we register only SIGINT and SIGHUP for now.
signal.Ignore()
sigChan = make(chan os.Signal, 1)
simpleServiceShutdown = make(chan bool)
go signalHandler()
go simpleServiceStarter()
<-simpleServiceShutdown // wait server to shutdown
close(simpleServiceShutdown)
}
发送信号后,服务器没有中断,还在等待。
Run the program as:
$ ./simpleHttp
starting http server on :9000
signalHandler() received signal: interrupt
simple service shutdown on signal interrupt, error: <nil>
$
From another terminal send the signal as:
tester 30202 4379 0 09:14 pts/8 00:00:00 ./simpleHttp
kill -s SIGINT 30202
我正在使用go1.12.6 linux/amd64。
【问题讨论】:
标签: go