简言

1. 程序退出时不应该是kill -9暴力地杀死程序

2. 监听系统信号,进程收到指定信号(TERM,INTR等信号)后,做完善后工作,再退出程序是常规做法

3. golang语言监听系统信号很简洁,寥寥几行代码就可以很优雅地处理系统信号

4. kill -9 pid 触发的SIGKILL信号无法被处理,因为进程已经被系统强制关闭了

示例


package main
import (
	"fmt"
	"os"
	"os/signal"
	"syscall"
	"time"
)

func Logic() {
	for {
		time.Sleep(time.Second*2)
		fmt.Println("logic time=",time.Now().Unix())
	}
}
func main() {
	// 逻辑处理协程
	go Logic()

	// 监控两个信号
	// TERM信号(kill + 进程号 触发)
	// 中断信号(ctrl + c 触发)
	osc := make(chan os.Signal, 1)
	signal.Notify(osc,syscall.SIGTERM, syscall.SIGINT)
	s := <- osc
	fmt.Println("监听到退出信号,s=",s)

	// 退出前的清理操作
	// clean()

	fmt.Println("main程序退出")
}

效果及讲解1

启动进程(go run命令启动进程,几秒后,用ps命令找到该进程,使用kill +进程号来发信号)

触发kill命令时的操作

注意:我们发给的进程是 "/tmp/go-build625650565/b001/exe/main2"所属的进程

不是"go run main2.go"所属的进程,这个只是启动程序时的命令进程,不是我们真正的运行程序

 

效果及讲解2(启动进程几秒后,按下ctrl+c键即可触发SIGINTR信号)