sig_quiter.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package svcfw
  2. import (
  3. "context"
  4. "git.swzry.com/zry/zry-go-program-framework/core"
  5. "os"
  6. "os/signal"
  7. )
  8. var _ core.ISubService = (*WatchSignalExitSubService)(nil)
  9. type WatchSignalExitSubService struct {
  10. qchan chan os.Signal
  11. ctx context.Context
  12. cncl context.CancelFunc
  13. SignalNotifyFunc func(sig os.Signal)
  14. sigList []os.Signal
  15. }
  16. func NewWatchSignalExitSubService(sig ...os.Signal) *WatchSignalExitSubService {
  17. r := &WatchSignalExitSubService{
  18. qchan: make(chan os.Signal, 0),
  19. sigList: sig,
  20. }
  21. return r
  22. }
  23. func NewWatchSignalExitSubServiceWithDefault() *WatchSignalExitSubService {
  24. r := &WatchSignalExitSubService{
  25. qchan: make(chan os.Signal, 0),
  26. sigList: []os.Signal{
  27. os.Interrupt,
  28. os.Kill,
  29. },
  30. }
  31. return r
  32. }
  33. func (q *WatchSignalExitSubService) Prepare(ctx *core.SubServiceContext) error {
  34. return nil
  35. }
  36. func (q *WatchSignalExitSubService) Run(ctx *core.SubServiceContext) error {
  37. signal.Notify(q.qchan, q.sigList...)
  38. q.ctx, q.cncl = context.WithCancel(context.Background())
  39. select {
  40. case <-q.ctx.Done():
  41. {
  42. close(q.qchan)
  43. return nil
  44. }
  45. case sig := <-q.qchan:
  46. {
  47. ctx.InfoF("signal '%s' caught. will shutdown program.", sig.String())
  48. if q.cncl != nil {
  49. q.cncl()
  50. }
  51. if q.SignalNotifyFunc != nil {
  52. q.SignalNotifyFunc(sig)
  53. }
  54. return nil
  55. }
  56. }
  57. }
  58. func (q *WatchSignalExitSubService) Stop(ctx *core.SubServiceContext) {
  59. if q.cncl != nil {
  60. q.cncl()
  61. }
  62. }