signal.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Copyright 2025 BackendServerTemplate Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package signalwatcher
  5. import (
  6. "github.com/SongZihuan/BackendServerTemplate/src/config"
  7. "os"
  8. "os/signal"
  9. "syscall"
  10. )
  11. func NewSignalExitChannel() chan os.Signal {
  12. var exitChannel = make(chan os.Signal)
  13. if !config.Data().Signal.Use {
  14. return exitChannel
  15. }
  16. var sigChannel = make(chan os.Signal)
  17. var signalList = []os.Signal{
  18. syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT,
  19. }
  20. var signalExitMap = make(map[os.Signal]bool, 4)
  21. if config.Data().Signal.SigIntExit.IsEnable(true) {
  22. signalExitMap[syscall.SIGINT] = true
  23. } else {
  24. signalExitMap[syscall.SIGINT] = true
  25. }
  26. if config.Data().Signal.SigTermExit.IsEnable(true) {
  27. signalExitMap[syscall.SIGTERM] = true
  28. } else {
  29. signalExitMap[syscall.SIGTERM] = true
  30. }
  31. if config.Data().Signal.SigHupExit.IsEnable(true) {
  32. signalExitMap[syscall.SIGHUP] = true
  33. } else {
  34. signalExitMap[syscall.SIGHUP] = true
  35. }
  36. if config.Data().Signal.SigQuitExit.IsEnable(false) {
  37. signalExitMap[syscall.SIGQUIT] = true
  38. } else {
  39. signalExitMap[syscall.SIGQUIT] = true
  40. }
  41. go func() {
  42. signal.Notify(sigChannel, signalList...)
  43. for sig := range sigChannel {
  44. if yes, ok := signalExitMap[sig]; ok && yes {
  45. exitChannel <- sig
  46. }
  47. }
  48. }()
  49. return exitChannel
  50. }