signal是进程的命令信号,程序可以通过响应对应进程信号作出相应,例如stop、reload、restart。
go signal定义在os.Signal的一个接口,os/signal实现系统响应接口。
linux的kill、systemctl命令都可以发出信号。
kill 默认是15退出程序,常用 kill -9 就是强制退出,kill -l可以查询系统全部信号。
可以使用kill -0 测试pid是否存在,信号0不会对程序有影响。
kill -0 11148 && echo "succes" || echo "faild"
systemctl通常来start、stop、restart、reload、statue使用,stop、reload、restart分别对应的信号是15、10、12,只要自己程序响应这几个信号也可以使用systemctl管理。
go中涉及signal的标准库有三个,os、os/signal、syscall。
os定义Signal接口,os/signal定义对系统Signal的监听,syscall定义系统Signal对象。
type Signal interface {
String() string
Signal()
}
func (p *Process) Signal(sig Signal) error
func Ignore(sig ...os.Signal)
func Ignored(sig os.Signal) bool
func Notify(c chan<- os.Signal, sig ...os.Signal)
func Reset(sig ...os.Signal)
func Stop(c chan<- os.Signal)
func Kill(pid int, sig Signal) (err error)
...
一个官网例子
signal.Notify函数第一个参数是chan<- os.Signal,用来接收系统收到的信号,第二个参数是...os.Signal,指定监听的信号,如果为空就监听全部。
通常goroutine一个协程for处理一个chan<- os.Signal,对收到的系统信号处理。
init启动了一个独立协程,然后获取signal并处理,SignalListen就先关闭原先监听,然后监听新信号。
在POSIX.1-1990标准中定义的信号列表
无效内存引用(试图访问不属于自己的内存空间、对只读内存空间进行写操作)
消息管道损坏(FIFO/Socket通信时,管道未打开而进行写操作)
在SUSv2和POSIX.1-2001标准中的信号列表:
Pollable event (Sys V). Synonym for SIGIO
性能时钟信号(包含系统调用时间和进程占用CPU的时间)
虚拟时钟信号(进程占用CPU的时间)(4.2BSD)