package keeper /* Сторож системных сигналов. Мониторит ОС и части сервиса на завершение работы. В системе он должен быть только один. */ import ( "os" "os/signal" "syscall" "wartank/pkg/types" ) // Keeper -- сторож системных и внутренних сигналов type Keeper struct { kernel types.IKernel slog types.ISlog chSys chan os.Signal } // NewKeeper -- возвращает глобальный объект сторожа *Keeper func NewKeeper(kernel types.IKernel) *Keeper { if kernel == nil { panic("GetKeeper(): IKernel is nil") } сам := &Keeper{ kernel: kernel, slog: kernel.Slog(), chSys: make(chan os.Signal, 3), } сам.kernel.Wg().Add("keeper") signal.Notify(сам.chSys, os.Interrupt, syscall.SIGTERM) go сам.run() сам.slog.Debugf("NewKeeper()\n") return сам } // Слушает сигналы завершения изнутри и снаружи func (сам *Keeper) run() { сам.slog.Infof("Keeper.run()\n") defer func() { сам.slog.Infof("Keeper.run(): end\n") сам.kernel.Wg().Done("keeper") }() select { case sig := <-сам.kernel.Done(): // глобальная отмена контекста сам.slog.Infof("Keeper.run(): intern_sig=%q\n", sig) case sig := <-сам.chSys: // Системный сигнал закрытия сам.kernel.CancelApp() сам.slog.Infof("Keeper.run(): sys_sig=%v\n", sig) } }