| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- 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)
- }
- }
|