func daemon(context *cli.Context) error { // setup a standard reaper so that we don't leave any zombies if we are still alive // this is just good practice because we are spawning new processes s := make(chan os.Signal, 2048) signal.Notify(s, syscall.SIGCHLD, syscall.SIGTERM, syscall.SIGINT) if err := osutils.SetSubreaper(1); err != nil { logrus.WithField("error", err).Error("containerd: set subpreaper") } sv, err := supervisor.New( context.String("state-dir"), context.String("runtime"), context.String("shim"), context.StringSlice("runtime-args"), context.Duration("start-timeout"), context.Int("retain-count")) if err != nil { return err } wg := &sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) w := supervisor.NewWorker(sv, wg) go w.Start() } if err := sv.Start(); err != nil { return err } // Split the listen string of the form proto://addr listenSpec := context.String("listen") listenParts := strings.SplitN(listenSpec, "://", 2) if len(listenParts) != 2 { return fmt.Errorf("bad listen address format %s, expected proto://address", listenSpec) } server, err := startServer(listenParts[0], listenParts[1], sv) if err != nil { return err } for ss := range s { switch ss { case syscall.SIGCHLD: if _, err := osutils.Reap(); err != nil { logrus.WithField("error", err).Warn("containerd: reap child processes") } default: logrus.Infof("stopping containerd after receiving %s", ss) server.Stop() os.Exit(0) } } return nil }
func daemon(id, address, stateDir string, concurrency int, oom bool) error { tasks := make(chan *supervisor.StartTask, concurrency*100) sv, err := supervisor.New(id, stateDir, tasks, oom) if err != nil { return err } wg := &sync.WaitGroup{} for i := 0; i < concurrency; i++ { wg.Add(1) w := supervisor.NewWorker(sv, wg) go w.Start() } // only set containerd as the subreaper if it is not an init process if pid := os.Getpid(); pid != 1 { logrus.WithFields(logrus.Fields{ "pid": pid, }).Debug("containerd is not init, set as subreaper") if err := setSubReaper(); err != nil { return err } } // start the signal handler in the background. go startSignalHandler(sv) if err := sv.Start(); err != nil { return err } if err := os.RemoveAll(address); err != nil { return err } l, err := net.Listen("unix", address) if err != nil { return err } s := grpc.NewServer() types.RegisterAPIServer(s, server.NewServer(sv)) protoversion.RegisterAPIServer( s, protoversion.NewAPIServer( containerd.Version, protoversion.APIServerOptions{ DisableLogging: true, }, ), ) logrus.Debugf("GRPC API listen on %s", address) return s.Serve(l) }
func daemon(context *cli.Context) error { s := make(chan os.Signal, 2048) signal.Notify(s, syscall.SIGTERM, syscall.SIGINT) osutils.SetSubreaper(1) sv, err := supervisor.New( context.String("state-dir"), context.String("runtime"), context.String("shim"), context.StringSlice("runtime-args"), context.Duration("start-timeout"), context.Int("retain-count")) if err != nil { return err } wg := &sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) w := supervisor.NewWorker(sv, wg) go w.Start() } if err := sv.Start(); err != nil { return err } // Split the listen string of the form proto://addr listenSpec := context.String("listen") listenParts := strings.SplitN(listenSpec, "://", 2) if len(listenParts) != 2 { return fmt.Errorf("bad listen address format %s, expected proto://address", listenSpec) } server, err := startServer(listenParts[0], listenParts[1], sv) if err != nil { return err } for ss := range s { switch ss { default: logrus.Infof("stopping containerd after receiving %s", ss) server.Stop() os.Exit(0) } } return nil }
func daemon(stateDir string, concurrency int, runtimeName string, runtimeArgs []string) (types.APIServer, error) { if err := subreaper.Start(); err != nil { logrus.WithField("error", err).Error("containerd: start subreaper") } sv, err := supervisor.New(filepath.Join(stateDir, "containerd"), runtimeName, "", runtimeArgs, 15*time.Second, 500) if err != nil { return nil, err } wg := &sync.WaitGroup{} for i := 0; i < concurrency; i++ { wg.Add(1) w := supervisor.NewWorker(sv, wg) go w.Start() } if err := sv.Start(); err != nil { return nil, err } return server.NewServer(sv), nil }
func daemon(address, stateDir string, concurrency int, runtimeName string, runtimeArgs []string, shimName string, timeout time.Duration) error { // setup a standard reaper so that we don't leave any zombies if we are still alive // this is just good practice because we are spawning new processes s := make(chan os.Signal, 2048) signal.Notify(s, syscall.SIGCHLD, syscall.SIGTERM, syscall.SIGINT) if err := osutils.SetSubreaper(1); err != nil { logrus.WithField("error", err).Error("containerd: set subpreaper") } sv, err := supervisor.New(stateDir, runtimeName, shimName, runtimeArgs, timeout) if err != nil { return err } wg := &sync.WaitGroup{} for i := 0; i < concurrency; i++ { wg.Add(1) w := supervisor.NewWorker(sv, wg) go w.Start() } if err := sv.Start(); err != nil { return err } server, err := startServer(address, sv) if err != nil { return err } for ss := range s { switch ss { case syscall.SIGCHLD: if _, err := osutils.Reap(); err != nil { logrus.WithField("error", err).Warn("containerd: reap child processes") } default: logrus.Infof("stopping containerd after receiving %s", ss) server.Stop() os.Exit(0) } } return nil }