简言
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信号)