package main
import (
"context"
"flag"
"log"
"os"
"os/signal"
"sync"
"syscall"
)
var (
f = flag.String("f", "default value", "explain for f")
)
func main() {
logger := log.New(os.Stdout, "[cli-tool]", log.Ldate)
ctx, cancel := context.WithCancel(context.Background())
var wg sync.WaitGroup
//
// main code here
//
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for {
select {
case <-ctx.Done():
return
default:
logger.Println("something done !")
}
}
}()
}
//
// signal handling
//
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan,
syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT)
exitChan := make(chan struct{}, 1)
go func() {
<-sigChan
cancel()
wg.Wait()
//
// clean up code here
//
exitChan <- struct{}{}
}()
<-exitChan
}