package common import ( "context" "os" "sync" "time" ) // Disturber stop type Disturber struct { mtx sync.Mutex live bool until int maxTry int } // NewDisturber new func NewDisturber(maxTry int) *Disturber { return &Disturber{ live: true, until: 0, maxTry: maxTry, } } // Prevent prevent func (d *Disturber) Prevent() { d.mtx.Lock() defer d.mtx.Unlock() d.live = true } // MaybeReboot reboot func (d *Disturber) MaybeReboot(ctx context.Context, fn func(...interface{})) { d.live = true for { select { case <-ctx.Done(): return default: d.mtx.Lock() running := d.live d.mtx.Unlock() if running { d.until = 0 d.mtx.Lock() d.live = false d.mtx.Unlock() } else { d.until++ fn("!!!!!!No Running: ", d.until) if d.until > d.maxTry { fn("!!!!!!Too Long Running, Reboot: ", d.maxTry) os.Exit(0) } } time.Sleep(time.Second) } } }