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  }