github.com/hinshun/containerd@v0.2.7/supervisor/add_process.go (about) 1 package supervisor 2 3 import ( 4 "os" 5 "time" 6 7 "github.com/docker/containerd/runtime" 8 "github.com/docker/containerd/specs" 9 "golang.org/x/net/context" 10 ) 11 12 // AddProcessTask holds everything necessary to add a process to a 13 // container 14 type AddProcessTask struct { 15 baseTask 16 ID string 17 PID string 18 Stdout string 19 Stderr string 20 Stdin string 21 ProcessSpec *specs.ProcessSpec 22 StartResponse chan StartResponse 23 Ctx context.Context 24 } 25 26 func (s *Supervisor) addProcess(t *AddProcessTask) error { 27 start := time.Now() 28 ci, ok := s.containers[t.ID] 29 if !ok { 30 return ErrContainerNotFound 31 } 32 process, err := ci.container.Exec(t.Ctx, t.PID, *t.ProcessSpec, runtime.NewStdio(t.Stdin, t.Stdout, t.Stderr)) 33 if err != nil { 34 return err 35 } 36 s.newExecSyncChannel(t.ID, t.PID) 37 if err := s.monitorProcess(process); err != nil { 38 s.deleteExecSyncChannel(t.ID, t.PID) 39 // Kill process 40 process.Signal(os.Kill) 41 ci.container.RemoveProcess(t.PID) 42 return err 43 } 44 ExecProcessTimer.UpdateSince(start) 45 t.StartResponse <- StartResponse{ExecPid: process.SystemPid()} 46 s.notifySubscribers(Event{ 47 Timestamp: time.Now(), 48 Type: StateStartProcess, 49 PID: t.PID, 50 ID: t.ID, 51 }) 52 return nil 53 }