mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 06:03:57 +08:00
9087f2e827
When we use cgroup with systemd driver, the cgroup path will be auto removed by systemd when all processes exited. So we should check cgroup path exists when we access the cgroup path, for example in `kill/ps`, or else we will got an error. Signed-off-by: lifubang <lifubang@acmcoder.com>
76 lines
1.8 KiB
Go
76 lines
1.8 KiB
Go
// +build linux
|
|
|
|
package cgroups
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/opencontainers/runc/libcontainer/configs"
|
|
)
|
|
|
|
type Manager interface {
|
|
// Applies cgroup configuration to the process with the specified pid
|
|
Apply(pid int) error
|
|
|
|
// Returns the PIDs inside the cgroup set
|
|
GetPids() ([]int, error)
|
|
|
|
// Returns the PIDs inside the cgroup set & all sub-cgroups
|
|
GetAllPids() ([]int, error)
|
|
|
|
// Returns statistics for the cgroup set
|
|
GetStats() (*Stats, error)
|
|
|
|
// Toggles the freezer cgroup according with specified state
|
|
Freeze(state configs.FreezerState) error
|
|
|
|
// Destroys the cgroup set
|
|
Destroy() error
|
|
|
|
// Path returns a cgroup path to the specified controller/subsystem.
|
|
// For cgroupv2, the argument is unused and can be empty.
|
|
Path(string) string
|
|
|
|
// Sets the cgroup as configured.
|
|
Set(container *configs.Config) error
|
|
|
|
// GetPaths returns cgroup path(s) to save in a state file in order to restore later.
|
|
//
|
|
// For cgroup v1, a key is cgroup subsystem name, and the value is the path
|
|
// to the cgroup for this subsystem.
|
|
//
|
|
// For cgroup v2 unified hierarchy, a key is "", and the value is the unified path.
|
|
GetPaths() map[string]string
|
|
|
|
// GetCgroups returns the cgroup data as configured.
|
|
GetCgroups() (*configs.Cgroup, error)
|
|
|
|
// GetFreezerState retrieves the current FreezerState of the cgroup.
|
|
GetFreezerState() (configs.FreezerState, error)
|
|
|
|
// Whether the cgroup path exists or not
|
|
Exists() bool
|
|
}
|
|
|
|
type NotFoundError struct {
|
|
Subsystem string
|
|
}
|
|
|
|
func (e *NotFoundError) Error() string {
|
|
return fmt.Sprintf("mountpoint for %s not found", e.Subsystem)
|
|
}
|
|
|
|
func NewNotFoundError(sub string) error {
|
|
return &NotFoundError{
|
|
Subsystem: sub,
|
|
}
|
|
}
|
|
|
|
func IsNotFound(err error) bool {
|
|
if err == nil {
|
|
return false
|
|
}
|
|
_, ok := err.(*NotFoundError)
|
|
return ok
|
|
}
|