signal.go 1.3 KB

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