From ee2fd8e98fa3ed32e8994a36348ff629b569d14e Mon Sep 17 00:00:00 2001 From: sawka Date: Sun, 12 Mar 2023 15:24:53 -0700 Subject: [PATCH] let SIGHUP or stdin close trigger a shutdown --- cmd/main-server.go | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/cmd/main-server.go b/cmd/main-server.go index d9dfca76..795d178b 100644 --- a/cmd/main-server.go +++ b/cmd/main-server.go @@ -52,6 +52,7 @@ var GlobalLock = &sync.Mutex{} var WSStateMap = make(map[string]*scws.WSState) // clientid -> WsState var GlobalAuthKey string var BuildTime = "0" +var shutdownOnce sync.Once type ClientActiveState struct { Fg bool `json:"fg"` @@ -450,18 +451,10 @@ func stdinReadWatch() { for { _, err := os.Stdin.Read(buf) if err != nil { - log.Printf("[prompt] stdin closed/error, shutting down: %v\n", err) - sendTelemetryWrapper() - log.Printf("[prompt] closing db connection\n") - sstore.CloseDB() - log.Printf("[prompt] *** shutting down local server\n") - time.Sleep(1 * time.Second) - syscall.Kill(syscall.Getpid(), syscall.SIGINT) + doShutdown(fmt.Sprintf("stdin closed/error (%v)", err)) break } } - time.Sleep(10 * time.Second) - syscall.Kill(syscall.Getpid(), syscall.SIGKILL) } // ignore SIGHUP @@ -470,11 +463,26 @@ func installSignalHandlers() { signal.Notify(sigCh, syscall.SIGHUP) go func() { for sig := range sigCh { - fmt.Printf("[prompt] got signal %v (ignoring)\n", sig) + doShutdown(fmt.Sprintf("got signal %v", sig)) + break } }() } +func doShutdown(reason string) { + shutdownOnce.Do(func() { + log.Printf("[prompt] local server %v, start shutdown\n", reason) + sendTelemetryWrapper() + log.Printf("[prompt] closing db connection\n") + sstore.CloseDB() + log.Printf("[prompt] *** shutting down local server\n") + time.Sleep(1 * time.Second) + syscall.Kill(syscall.Getpid(), syscall.SIGINT) + time.Sleep(5 * time.Second) + syscall.Kill(syscall.Getpid(), syscall.SIGKILL) + }) +} + func main() { scbase.BuildTime = BuildTime