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  }