keeper.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package keeper
  2. /*
  3. Сторож системных сигналов.
  4. Мониторит ОС и части сервиса на завершение работы.
  5. В системе он должен быть только один.
  6. */
  7. import (
  8. "os"
  9. "os/signal"
  10. "syscall"
  11. "wartank/pkg/types"
  12. )
  13. // Keeper -- сторож системных и внутренних сигналов
  14. type Keeper struct {
  15. kernel types.IKernel
  16. slog types.ISlog
  17. chSys chan os.Signal
  18. }
  19. // NewKeeper -- возвращает глобальный объект сторожа *Keeper
  20. func NewKeeper(kernel types.IKernel) *Keeper {
  21. if kernel == nil {
  22. panic("GetKeeper(): IKernel is nil")
  23. }
  24. сам := &Keeper{
  25. kernel: kernel,
  26. slog: kernel.Slog(),
  27. chSys: make(chan os.Signal, 3),
  28. }
  29. сам.kernel.Wg().Add("keeper")
  30. signal.Notify(сам.chSys, os.Interrupt, syscall.SIGTERM)
  31. go сам.run()
  32. сам.slog.Debugf("NewKeeper()\n")
  33. return сам
  34. }
  35. // Слушает сигналы завершения изнутри и снаружи
  36. func (сам *Keeper) run() {
  37. сам.slog.Infof("Keeper.run()\n")
  38. defer func() {
  39. сам.slog.Infof("Keeper.run(): end\n")
  40. сам.kernel.Wg().Done("keeper")
  41. }()
  42. select {
  43. case sig := <-сам.kernel.Done(): // глобальная отмена контекста
  44. сам.slog.Infof("Keeper.run(): intern_sig=%q\n", sig)
  45. case sig := <-сам.chSys: // Системный сигнал закрытия
  46. сам.kernel.CancelApp()
  47. сам.slog.Infof("Keeper.run(): sys_sig=%v\n", sig)
  48. }
  49. }