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 程序,但是接口依然被占用,所以想知道问题在哪里。

讨论数量: 6

得确认没有请求连接了才行

1年前 评论

@deatil 那代码层面应该如何改写呢

1年前 评论

你可以在程序中打一下你接的信号量,我怀疑压根没有接到 hup 命令,系统把你的程序挂起了,并不是把信号发给你。就像kill -9 ,程序拿不到信号量

1年前 评论
滚球兽进化 (作者) 1年前

file 这个是supervisor配置 我是通过supervisorctl stop bitian_go 配置的。 然后这个命令应该查询的pid不是同一个。

我通过lsof -i:8000 查到的pid 是正确的pid 通过 ps aux | grep main.go 获取的pid不是ppid

1年前 评论

找到问题了,其实是go启动后,会另外开启一个子任务,所以需要kill group 把所有子任务关闭才可以。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!