diff --git a/examples/miscs/run_syssig.go b/examples/miscs/run_syssig.go new file mode 100644 index 0000000000000000000000000000000000000000..af45247e13a50a98635498aa635901943f9b9d63 --- /dev/null +++ b/examples/miscs/run_syssig.go @@ -0,0 +1,18 @@ +package main + +import ( + "fmt" + "gitee.com/scottq/go-framework/src/miscs" + "os" + "time" +) + +func main() { + go miscs.CatchSysSig(func(sig os.Signal) { + fmt.Println("catch signal", sig) + time.Sleep(time.Second) + os.Exit(1) + }, miscs.DefSysSigs...) + + time.Sleep(time.Minute * 10) +} diff --git a/src/miscs/err.go b/src/miscs/err.go index e1d749717c310fd422ebf696fa7c3c713783d17a..6ecf0b52866b841e09380d89743cccadbb5a06fe 100644 --- a/src/miscs/err.go +++ b/src/miscs/err.go @@ -2,13 +2,43 @@ package miscs import ( "log" + "os" + "os/signal" "runtime/debug" + "syscall" ) -func CatchRecover() { - err := recover() - if err != nil { +//CatchRecover 捕获异常处理 +func CatchRecover(fs ...func(interface{})) { + if err := recover(); err != nil { log.Printf("recover err: %s\n", err) log.Printf("recover Stack: %s\n", debug.Stack()) + for _, f := range fs { + f(err) + } + } +} + +//DefSysSigs 默认监听的系统信号 +var DefSysSigs = []os.Signal{ + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + syscall.SIGHUP, + syscall.SIGABRT, +} + +//CatchSysSig 捕获系统信号 +//捕获后处理 +func CatchSysSig(f func(os.Signal), signs ...os.Signal) { + signCh := make(chan os.Signal, 0) + signal.Notify(signCh, signs...) + for { + select { + case sig := <-signCh: + if f != nil { + f(sig) + } + } } } diff --git a/src/miscs/err_test.go b/src/miscs/err_test.go new file mode 100644 index 0000000000000000000000000000000000000000..ea24bc40b8d3a09800e88dcc8bcdd504780f94e1 --- /dev/null +++ b/src/miscs/err_test.go @@ -0,0 +1,17 @@ +package miscs + +import ( + "os" + "testing" + "time" +) + +func TestCatchSysSig(t *testing.T) { + go CatchSysSig(func(sig os.Signal) { + t.Logf("catch signal %d", sig) + time.Sleep(time.Second) + os.Exit(0) + }) + + time.Sleep(time.Minute * 10) +}