/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ package main import ( "context" "log" "net/http" "os" "os/signal" "strconv" "time" "golang.org/x/sys/unix" ) func main() { ctx, cancel := context.WithCancel(context.Background()) srv := NewServer(ctx) // Catch signals cleanup := make(chan struct{}) go func() { sig := make(chan os.Signal, 1) signal.Notify(sig, unix.SIGINT, unix.SIGTERM) Loop: for { select { case <-sig: log.Println("caught signal; canceling operations...") cancel() log.Println("shutting down...") if err := srv.Shutdown(); err != nil { log.Printf("shutdown: %v", err) } break Loop case <-ctx.Done(): log.Println("received server done") break Loop case <-time.After(100 * time.Millisecond): // do nothing; just throttle cpu } } close(cleanup) }() listenPort := 4140 if len(os.Args) == 2 { if port, err := strconv.Atoi(os.Args[1]); err == nil { if 1 <= port && port <= 65535 { listenPort = port } } } err := srv.ListenAndServe(listenPort) if err != http.ErrServerClosed { log.Printf("server error: %v", err) } cancel() <-cleanup log.Println("cleanup complete") }