90 lines
2.1 KiB
Go
90 lines
2.1 KiB
Go
// +build !windows
|
|
|
|
package proc
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/containerd/console"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// RuncRoot is the path to the root runc state directory
|
|
const RuncRoot = "/run/containerd/runc"
|
|
|
|
// Stdio of a process
|
|
type Stdio struct {
|
|
Stdin string
|
|
Stdout string
|
|
Stderr string
|
|
Terminal bool
|
|
}
|
|
|
|
// IsNull returns true if the stdio is not defined
|
|
func (s Stdio) IsNull() bool {
|
|
return s.Stdin == "" && s.Stdout == "" && s.Stderr == ""
|
|
}
|
|
|
|
// Process on a linux system
|
|
type Process interface {
|
|
State
|
|
// ID returns the id for the process
|
|
ID() string
|
|
// Pid returns the pid for the process
|
|
Pid() int
|
|
// ExitStatus returns the exit status
|
|
ExitStatus() int
|
|
// ExitedAt is the time the process exited
|
|
ExitedAt() time.Time
|
|
// Stdin returns the process STDIN
|
|
Stdin() io.Closer
|
|
// Stdio returns io information for the container
|
|
Stdio() Stdio
|
|
// Status returns the process status
|
|
Status(context.Context) (string, error)
|
|
// Wait blocks until the process has exited
|
|
Wait()
|
|
}
|
|
|
|
// State of a process
|
|
type State interface {
|
|
// Resize resizes the process console
|
|
Resize(ws console.WinSize) error
|
|
// Start execution of the process
|
|
Start(context.Context) error
|
|
// Delete deletes the process and its resourcess
|
|
Delete(context.Context) error
|
|
// Kill kills the process
|
|
Kill(context.Context, uint32, bool) error
|
|
// SetExited sets the exit status for the process
|
|
SetExited(status int)
|
|
}
|
|
|
|
func stateName(v interface{}) string {
|
|
switch v.(type) {
|
|
case *runningState, *execRunningState:
|
|
return "running"
|
|
case *createdState, *execCreatedState, *createdCheckpointState:
|
|
return "created"
|
|
case *pausedState:
|
|
return "paused"
|
|
case *deletedState:
|
|
return "deleted"
|
|
case *stoppedState:
|
|
return "stopped"
|
|
}
|
|
panic(errors.Errorf("invalid state %v", v))
|
|
}
|
|
|
|
// Platform handles platform-specific behavior that may differs across
|
|
// platform implementations
|
|
type Platform interface {
|
|
CopyConsole(ctx context.Context, console console.Console, stdin, stdout, stderr string,
|
|
wg, cwg *sync.WaitGroup) (console.Console, error)
|
|
ShutdownConsole(ctx context.Context, console console.Console) error
|
|
Close() error
|
|
}
|