go 退出但是端口依然被占用的原因
package main
import (
setting "bitian_go/pkg"
"bitian_go/routers"
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
//var EsClient *elastic.Client
func init() {
setting.Setup()
setting.NewMysqlClient()
setting.InitRedis()
//EsClient = setting.NewEsClient()
}
func main() {
r := routers.Router()
srv := &http.Server{
Addr: ":8000",
Handler: r,
ReadTimeout: 30 * time.Second,
WriteTimeout: 30 * time.Second,
MaxHeaderBytes: 1 << 20,
}
go func() {
// 服务连接
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
}
}()
// 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt, syscall.SIGQUIT, syscall.SIGHUP)
<-quit
log.Println("Shutdown Server ...")
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatal("Server Shutdown:", err)
}
log.Println("Server exiting")
}
现在通过hup 命令可以关闭go 程序,但是接口依然被占用,所以想知道问题在哪里。
得确认没有请求连接了才行
@deatil 那代码层面应该如何改写呢
你可以在程序中打一下你接的信号量,我怀疑压根没有接到 hup 命令,系统把你的程序挂起了,并不是把信号发给你。就像kill -9 ,程序拿不到信号量
我通过lsof -i:8000 查到的pid 是正确的pid 通过 ps aux | grep main.go 获取的pid不是ppid
找到问题了,其实是go启动后,会另外开启一个子任务,所以需要kill group 把所有子任务关闭才可以。