func (c *Controller) shutdown() { glog.V(1).Infof("controller for %v shutting down\n", c.dockerID) //defers run in LIFO order defer os.Exit(c.exitStatus) defer zzk.ShutdownConnections() }
func (d *daemon) run() (err error) { if d.hostID, err = utils.HostID(); err != nil { glog.Fatalf("Could not get host ID: %s", err) } else if err := validation.ValidHostID(d.hostID); err != nil { glog.Errorf("invalid hostid: %s", d.hostID) } if currentDockerVersion, err := node.GetDockerVersion(); err != nil { glog.Fatalf("Could not get docker version: %s", err) } else if minDockerVersion.Compare(currentDockerVersion.Client) < 0 { glog.Fatalf("serviced requires docker >= %s", minDockerVersion) } if _, ok := volume.Registered(options.FSType); !ok { glog.Fatalf("no driver registered for %s", options.FSType) } d.startRPC() d.startDockerRegistryProxy() if options.Master { d.startISVCS() if err := d.startMaster(); err != nil { glog.Fatal(err) } } if options.Agent { if err := d.startAgent(); err != nil { glog.Fatal(err) } } signalC := make(chan os.Signal, 10) signal.Notify(signalC, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP) sig := <-signalC glog.Info("Shutting down due to interrupt") close(d.shutdown) done := make(chan struct{}) go func() { defer close(done) glog.Info("Stopping sub-processes") d.waitGroup.Wait() glog.Info("Sub-processes have stopped") }() select { case <-done: defer glog.Info("Shutdown") case <-time.After(60 * time.Second): defer glog.Infof("Timeout waiting for shutdown") } zzk.ShutdownConnections() if options.Master { switch sig { case syscall.SIGHUP: glog.Infof("Not shutting down isvcs") command := os.Args glog.Infof("Reloading by calling syscall.exec for command: %+v\n", command) syscall.Exec(command[0], command[0:], os.Environ()) default: d.stopISVCS() } } return nil }