123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- //go:build linux || darwin
- package proc
- import (
- "os"
- "os/signal"
- "syscall"
- "time"
- "github.com/wuntsong-org/go-zero-plus/core/logx"
- )
- const (
- profileDuration = time.Minute
- timeFormat = "0102150405"
- )
- var done = make(chan struct{})
- func init() {
- go func() {
- // https://golang.org/pkg/os/signal/#Notify
- signals := make(chan os.Signal, 1)
- signal.Notify(signals, syscall.SIGUSR1, syscall.SIGUSR2, syscall.SIGTERM, syscall.SIGINT)
- for {
- v := <-signals
- switch v {
- case syscall.SIGUSR1:
- dumpGoroutines(fileCreator{})
- case syscall.SIGUSR2:
- profiler := StartProfile()
- go func() {
- <-time.After(profileDuration)
- profiler.Stop()
- }()
- case syscall.SIGTERM:
- stopOnSignal()
- gracefulStop(signals, syscall.SIGTERM)
- case syscall.SIGINT:
- stopOnSignal()
- gracefulStop(signals, syscall.SIGINT)
- default:
- logx.Error("Got unregistered signal:", v)
- }
- }
- }()
- }
- // Done returns the channel that notifies the process quitting.
- func Done() <-chan struct{} {
- return done
- }
- func stopOnSignal() {
- select {
- case <-done:
- // already closed
- default:
- close(done)
- }
- }
|