Go信号监听

我还是第一次见用信号来控制pprof.之前都是开一个端口,需要时去请求


kill -1 是什么意思


kill -1 的意思是向一个进程发送 SIGUSR1 信号。

SIGUSR1 信号是一个用户定义信号,默认情况下不会对进程产生任何影响。但是进程可以选择去处理这个信号,做一些自定义的操作。

kill -1 的一些主要特点和功能:

  • SIGUSR1 信号编号是10,所以 kill -1 相当于 kill -SIGUSR1

  • 发送这个信号不会终止进程,仅仅提示进程它收到了这个信号。

  • 进程可以设置信号处理函数,来响应和处理收到的 SIGUSR1 信号。

  • 常用来提示进程做一些工作,例如打印日志,读取配置等。

  • 与终止信号如 SIGKILL、SIGTERM 不同,进程可以选择忽略这个信号。

  • 一些服务进程如 Nginx、MySQL 都支持 SIGUSR1 信号来重新打开日志或者其他定期任务。

所以总体来说,kill -1 是一个很轻量级的操作,仅仅提示进程发生了某个事件,不会termination进程。它常用在进程间通信或触发内部工作流程等场景。而不像SIGTERM那样直接强制结束进程。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
func signalHandle() {
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT, syscall.SIGABRT)
for {
si := <-ch
switch si {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
log.Infof("Taskon-server received exit signal:%s", si.String())
return
case syscall.SIGHUP:
// start pprof
debug.GlobalDebugService.StartPProf()
case syscall.SIGABRT:
// stop pprof
debug.GlobalDebugService.StopPProf()
default:
return
}
}
}

这段代码的作用是注册并监听 Unix 系统信号,来处理服务的关闭和重启操作。

具体分析:

  1. 使用 signal.Notify 函数注册信号通道 ch,监听常见的一些系统信号。

  2. 循环读取信号通道 ch,根据不同信号类型进行处理:

  • SIGQUIT、SIGTERM、SIGINT 等退出信号,直接返回结束进程。

  • SIGHUP 信号,启动 pprof 性能分析。

  • SIGABRT 信号,结束 pprof 分析。

  1. 其他未处理的信号直接返回。

通过这个信号处理函数,可以实现:

  • 接收 Unix 信号优雅地关闭服务进程。

  • 用 SIGHUP 信号实现服务热重启,启动性能分析程序。

  • 用 SIGABRT 信号停止性能分析程序。

所以总的来说,这个函数实现了基于信号的服务控制逻辑:监听信号并执行对应操作,比如重启、退出、性能分析等。这对于后台运行的服务进程来说是一个很常见的功能。



https://cloud.tencent.com/developer/article/1645996

https://colobu.com/2015/10/09/Linux-Signals/

https://superuser.com/questions/1075379/send-sigterm-with-command-line-shortcut

http://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter16/16.03.html

  • Ctrl-C 发送 INT signal (SIGINT),通常导致进程结束
  • Ctrl-Z 发送 TSTP signal (SIGTSTP); 通常导致进程挂起(suspend)
  • Ctrl-\ 发送 QUIT signal (SIGQUIT); 通常导致进程结束 和 dump core.
  • Ctrl-T (不是所有的UNIX都支持) 发送INFO signal (SIGINFO); 导致操作系统显示此运行命令的信息

taskon-server代码里面,用这个控制是否开启pprof监控