package main import ( "fmt" "log" "os" "os/signal" "runtime/debug" "syscall" "github.com/snail007/goproxy/services" ) var APP_VERSION = "No Version Provided" func main() { err := initConfig() if err != nil { log.Fatalf("err : %s", err) } if service != nil && service.S != nil { Clean(&service.S) } else { Clean(nil) } } func Clean(s *services.Service) { signalChan := make(chan os.Signal, 1) cleanupDone := make(chan bool) signal.Notify(signalChan, os.Interrupt, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) go func() { defer func() { if e := recover(); e != nil { fmt.Printf("crashed, err: %s\nstack:\n%s", e, string(debug.Stack())) } }() for range signalChan { log.Println("Received an interrupt, stopping services...") if s != nil && *s != nil { (*s).Clean() } if cmd != nil { log.Printf("clean process %d", cmd.Process.Pid) cmd.Process.Kill() } if *isDebug { saveProfiling() } cleanupDone <- true } }() <-cleanupDone os.Exit(0) }