signal.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package system
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. "os"
  7. "os/signal"
  8. "runtime"
  9. "syscall"
  10. )
  11. const (
  12. SIG_USR1 = syscall.Signal(10)
  13. )
  14. func DumpToJSON(s interface{}) string {
  15. marshal, err := json.Marshal(s)
  16. if err != nil {
  17. return err.Error()
  18. }
  19. return string(marshal)
  20. }
  21. func WaitSignal() {
  22. // 创建一个通道来接收信号
  23. sigs := make(chan os.Signal, 1)
  24. // 监听指定的信号
  25. signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, SIG_USR1)
  26. // 主循环,等待信号
  27. for {
  28. sig := <-sigs
  29. switch sig {
  30. case syscall.SIGINT, syscall.SIGTERM:
  31. // 接收到 SIGINT 或 SIGTERM 信号,退出程序
  32. log.Println("Received signal to terminate program")
  33. return
  34. case SIG_USR1:
  35. // 接收到 SIGUSR1 信号,dump 内存
  36. log.Println("Received signal to dump memory")
  37. stack := make([]byte, 1<<14) // 分配足够的空间
  38. length := runtime.Stack(stack, true) // 获取堆栈信息
  39. fmt.Fprintf(os.Stderr, "Stack trace:\n%s\n", stack[:length])
  40. // if err := pprof.WriteHeapProfile(f); err != nil {
  41. // log.Fatalf("could not write memory profile: %v", err)
  42. // }
  43. // log.Println("Memory dumped to mem.pprof")
  44. default:
  45. log.Printf("Received unknown signal: %v", sig)
  46. }
  47. }
  48. }