// Start starts the daemon. func Start( ctx apitypes.Context, config gofig.Config, host string, stop <-chan os.Signal) (<-chan error, error) { var ( err error errs = make(chan error) daemonErrChan <-chan error ) if daemonErrChan, err = start(ctx, config, host, stop); err != nil { ctx.WithError(err).Error("daemon failed to initialize") return nil, err } ctx.Info("service successfully initialized, waiting on stop signal") go func() { sig := <-stop ctx.WithField("signal", sig).Info("service received stop signal") util.WaitUntilLibStorageStopped(ctx, daemonErrChan) close(errs) }() return errs, nil }
// Execute executes the CLI. func (c *CLI) Execute() { defer func() { if c.activateLibStorage { util.WaitUntilLibStorageStopped(c.ctx, c.rsErrs) } }() defer func() { r := recover() switch r := r.(type) { case nil: return case int: log.Debugf("exiting with error code %d", r) os.Exit(r) case error: log.Panic(r) default: log.Debugf("exiting with default error code 1, r=%v", r) os.Exit(1) } }() c.execute() }