2021-10-12 05:04:04 +00:00
|
|
|
//go:build !windows
|
2021-09-11 11:16:39 +00:00
|
|
|
|
|
|
|
package debug
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
|
|
|
"os"
|
|
|
|
"os/signal"
|
|
|
|
"runtime/pprof"
|
|
|
|
|
|
|
|
_debug "github.com/ledgerwatch/erigon/common/debug"
|
|
|
|
"github.com/ledgerwatch/log/v3"
|
|
|
|
"golang.org/x/sys/unix"
|
|
|
|
)
|
|
|
|
|
2023-07-10 10:37:55 +00:00
|
|
|
func ListenSignals(stack io.Closer, logger log.Logger) {
|
2021-09-11 11:16:39 +00:00
|
|
|
sigc := make(chan os.Signal, 1)
|
|
|
|
signal.Notify(sigc, unix.SIGINT, unix.SIGTERM)
|
|
|
|
_debug.GetSigC(&sigc)
|
|
|
|
defer signal.Stop(sigc)
|
|
|
|
|
|
|
|
usr1 := make(chan os.Signal, 1)
|
|
|
|
signal.Notify(usr1, unix.SIGUSR1)
|
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case <-sigc:
|
2023-07-10 10:37:55 +00:00
|
|
|
logger.Info("Got interrupt, shutting down...")
|
2021-09-11 11:16:39 +00:00
|
|
|
if stack != nil {
|
|
|
|
go stack.Close()
|
|
|
|
}
|
|
|
|
for i := 10; i > 0; i-- {
|
|
|
|
<-sigc
|
|
|
|
if i > 1 {
|
2023-07-10 10:37:55 +00:00
|
|
|
logger.Warn("Already shutting down, interrupt more to panic.", "times", i-1)
|
2021-09-11 11:16:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
Exit() // ensure trace and CPU profile data is flushed.
|
|
|
|
LoudPanic("boom")
|
|
|
|
case <-usr1:
|
2022-08-25 03:27:24 +00:00
|
|
|
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
|
2021-09-11 11:16:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|