我正在使用 gorilla/mux 为我的 go 应用程序提供服务。为了让 http 服务器保持实时状态,我在我的服务器命令中使用了类似的通道,如下所示。
&cobra.Command{
Use: "server",
Run: func(cmd *cobra.Command, args []string) {
_, _, serverErr := runServer()
if serverErr != nil {
panic(err)
}
// keep the command up and running until it gets terminated
c := make(chan os.Signal, 2)
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
<-c
}
在 runServer 内部:
p := conf.Server.Port
listener, err := net.Listen("tcp", ":"+p)
if err != nil {
return nil, nil, errors.Wrap(err, "Unable to start server")
}
server := &http.Server{Handler: srv}
go func() {
if err := server.Serve(listener); err != nil {
fmt.Println(err)
}
}()
logger.Infof("Service available at port %s", p)
return server, listener, nil
我正在尝试为自动监视我的更改实现空气并再次重新编译并运行服务器命令。
问题是当 air 重新运行服务器命令时,由于通道仍处于活动状态,服务器给出端口已经使用错误。有什么方法可以杀死来自 cmd 的信号并再次运行,或者有其他方法可以杀死端口并再次运行吗?