github.com/AntonOrnatskyi/goproxy@v0.0.0-20190205095733-4526a9fa18b4/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "log" 6 "os" 7 "os/signal" 8 "runtime/debug" 9 "syscall" 10 11 "github.com/AntonOrnatskyi/goproxy/services" 12 ) 13 14 var APP_VERSION = "No Version Provided" 15 16 func main() { 17 err := initConfig() 18 if err != nil { 19 log.Fatalf("err : %s", err) 20 } 21 if service != nil && service.S != nil { 22 Clean(&service.S) 23 } else { 24 Clean(nil) 25 } 26 } 27 func Clean(s *services.Service) { 28 signalChan := make(chan os.Signal, 1) 29 cleanupDone := make(chan bool) 30 signal.Notify(signalChan, 31 os.Interrupt, 32 syscall.SIGHUP, 33 syscall.SIGINT, 34 syscall.SIGTERM, 35 syscall.SIGQUIT) 36 go func() { 37 defer func() { 38 if e := recover(); e != nil { 39 fmt.Printf("crashed, err: %s\nstack:\n%s", e, string(debug.Stack())) 40 } 41 }() 42 for range signalChan { 43 log.Println("Received an interrupt, stopping services...") 44 if s != nil && *s != nil { 45 (*s).Clean() 46 } 47 if cmd != nil { 48 log.Printf("clean process %d", cmd.Process.Pid) 49 cmd.Process.Kill() 50 } 51 if *isDebug { 52 saveProfiling() 53 } 54 cleanupDone <- true 55 } 56 }() 57 <-cleanupDone 58 os.Exit(0) 59 }