Golang Go语言中 signal.Notify 监听不到 托管到 supervisor 服务的启动/停止信号
如题所述,监听不到,但是启动的时候会有
signal:urgent I/O condition
Golang Go语言中 signal.Notify 监听不到 托管到 supervisor 服务的启动/停止信号
先发代码和实验过程
更多关于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 := <-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
对子进程的信号处理方式与直接运行程序时有所不同。
-
确认信号类型:首先,确保你正在监听正确的信号。常见的信号包括
os.Interrupt
(通常是Ctrl+C触发的SIGINT)和syscall.SIGTERM
(常用于请求程序终止)。supervisor
通常使用SIGTERM
来停止服务。 -
配置supervisor:检查
supervisor
的配置文件,确保服务停止时发送的是SIGTERM
信号。你可以在supervisor
的配置文件中为服务指定stopsignal
选项。 -
信号捕获代码:确保你的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) // 执行清理和退出逻辑 }() // 其余的程序逻辑 }
-
日志和调试:增加日志输出,以确认信号是否被接收和处理。
如果以上步骤仍然无法解决问题,可能需要检查supervisor
的日志,或者尝试使用其他服务管理工具,如systemd
,看是否能正确接收信号。