func main() { fmt.Println("main start") defer func() { fmt.Println("bye main from defer") }() sig := make(chan os.Signal) signal.Notify(sig, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGHUP) go func() { for s := range sig { switch s { // 手动退出时打印退出码 case syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGHUP: quit() if i, ok := s.(syscall.Signal); ok { os.Exit(int(i)) } else { os.Exit(0) } } } }() wait := make(chan bool) go func() { // 睡眠10秒钟自动退出 time.Sleep(10 * time.Second) close(wait) }() <-wait fmt.Println("main end") } func quit() { fmt.Println("gracefully quit") }