Golang Go语言中 signal.Notify 监听不到 托管到 supervisor 服务的启动/停止信号

发布于 1周前 作者 h691938207 来自 Go语言

如题所述,监听不到,但是启动的时候会有

signal:urgent I/O condition

Golang Go语言中 signal.Notify 监听不到 托管到 supervisor 服务的启动/停止信号
6 回复

先发代码和实验过程

更多关于Golang Go语言中 signal.Notify 监听不到 托管到 supervisor 服务的启动/停止信号的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是伪代码
<br> shutdown:= make(chan os.Signal,1),<br> signal.Notify(shutdown)<br> go func() {<br> for {<br> ss := &lt;-shutdown<br> log.Printf("signal:%s", ss.String())<br> return<br> }<br> }()<br>
我在其他的地方阻塞了主线程,当我用 supervisor 托管我的服务
stop xxx(我的程序在 supervisor 的名称)
日志没有任何打印
start xxx(我的程序在 supervisor 的名称)
日志过会才有打印
signal:urgent I/O condition

那如果不在 supervisord 下面运行呢,可以正常收到么?

不进行托管的话可以正常捕获

挂载到 system service 就可以正常捕获到,看来 supervisor 和系统不一致

在Golang中使用signal.Notify来监听系统信号时,如果你的程序是托管到像supervisor这样的服务管理工具中的,可能会遇到信号监听不到的问题。这通常是因为supervisor对子进程的信号处理方式与直接运行程序时有所不同。

  1. 确认信号类型:首先,确保你正在监听正确的信号。常见的信号包括os.Interrupt(通常是Ctrl+C触发的SIGINT)和syscall.SIGTERM(常用于请求程序终止)。supervisor通常使用SIGTERM来停止服务。

  2. 配置supervisor:检查supervisor的配置文件,确保服务停止时发送的是SIGTERM信号。你可以在supervisor的配置文件中为服务指定stopsignal选项。

  3. 信号捕获代码:确保你的Go程序中正确设置了信号监听。例如:

    import (
        "os"
        "os/signal"
        "syscall"
    )
    
    func main() {
        sigs := make(chan os.Signal, 1)
        signal.Notify(sigs, syscall.SIGTERM, os.Interrupt)
        go func() {
            sig := <-sigs
            fmt.Println("Received signal:", sig)
            // 执行清理和退出逻辑
        }()
        // 其余的程序逻辑
    }
    
  4. 日志和调试:增加日志输出,以确认信号是否被接收和处理。

如果以上步骤仍然无法解决问题,可能需要检查supervisor的日志,或者尝试使用其他服务管理工具,如systemd,看是否能正确接收信号。

回到顶部