Skip to content

Commit b3c41f6

Browse files
committed
Add killMode to killall command
1 parent bed39ac commit b3c41f6

File tree

3 files changed

+40
-16
lines changed

3 files changed

+40
-16
lines changed

cmd/killall/killall.go

+25-7
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,40 @@ type idAndError struct {
1616
err error
1717
}
1818

19-
func killWorker(ch <-chan string, errCh chan<- idAndError, wg *sync.WaitGroup) {
19+
func killFuncPct(id string) error {
20+
return pve.StopCmd(id).Run()
21+
}
22+
23+
func killFuncCgroup(id string) error {
24+
return cgroup.KillLXC(id)
25+
}
26+
27+
var killModes = map[string]func(string) error{
28+
"pct": killFuncPct,
29+
"cgroup": killFuncCgroup,
30+
}
31+
32+
func killWorker(killFunc func(string) error, ch <-chan string, errCh chan<- idAndError, wg *sync.WaitGroup) {
2033
defer wg.Done()
2134
for id := range ch {
22-
cmd := pve.Stop(id)
23-
if err := cmd.Run(); err != nil {
35+
if err := killFunc(id); err != nil {
2436
errCh <- idAndError{id, err}
2537
}
2638
}
2739
}
2840

29-
func killallMain(out io.Writer, n int, minID int) (err error) {
41+
func killallMain(out io.Writer, killMode string, n int, minID int) (err error) {
42+
killFunc, ok := killModes[killMode]
43+
if !ok {
44+
return fmt.Errorf("invalid kill mode: %s", killMode)
45+
}
46+
3047
ch := make(chan string)
3148
chErr := make(chan idAndError)
3249
wg := &sync.WaitGroup{}
3350
wg.Add(n)
3451
for i := 0; i < n; i++ {
35-
go killWorker(ch, chErr, wg)
52+
go killWorker(killFunc, ch, chErr, wg)
3653
}
3754
hasError := false
3855
go func() {
@@ -74,11 +91,12 @@ func MakeCmd() *cobra.Command {
7491
Args: cobra.NoArgs,
7592
}
7693
flags := cmd.Flags()
94+
pM := flags.StringP("mode", "m", "pct", "kill mode (pct or cgroup)")
7795
pN := flags.IntP("n", "n", 5, "max number of parallel killing containers")
78-
pS := flags.IntP("min", "m", 1000, "minimum ID of containers to kill")
96+
pS := flags.IntP("start", "s", 1000, "starting (minimum) ID of containers to kill")
7997

8098
cmd.RunE = func(cmd *cobra.Command, args []string) error {
81-
return killallMain(cmd.OutOrStderr(), *pN, *pS)
99+
return killallMain(cmd.OutOrStderr(), *pM, *pN, *pS)
82100
}
83101
return cmd
84102
}

pkg/cgroup/fs.go

+12-6
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ import (
88

99
const BaseDir = "/sys/fs/cgroup"
1010

11-
func Open(pathComp ...string) (*os.File, error) {
12-
pathComp = append([]string{BaseDir}, pathComp...)
13-
return os.Open(filepath.Join(pathComp...))
11+
func Open(filename string) (*os.File, error) {
12+
return os.Open(filepath.Join(BaseDir, filename))
1413
}
1514

16-
func OpenLXC(id string, pathComp ...string) (*os.File, error) {
17-
pathComp = append([]string{BaseDir, "lxc", id}, pathComp...)
18-
return os.Open(filepath.Join(pathComp...))
15+
func OpenLXC(id string, filename string) (*os.File, error) {
16+
return os.Open(GetFilenameLXC(id, filename))
17+
}
18+
19+
func GetFilenameLXC(id string, filename string) string {
20+
return filepath.Join(BaseDir, "lxc", id, filename)
1921
}
2022

2123
func ListLXC() ([]string, error) {
@@ -32,6 +34,10 @@ func ListLXC() ([]string, error) {
3234
return ids, nil
3335
}
3436

37+
func KillLXC(id string) error {
38+
return os.WriteFile(GetFilenameLXC(id, "cgroup.kill"), []byte("1"), 0)
39+
}
40+
3541
func GetLXCInitPid(id string) (int, error) {
3642
f, err := OpenLXC(id, "ns/init.scope/cgroup.procs")
3743
if err != nil {

pkg/pve/pct.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import "os/exec"
44

55
const PctPath = "/usr/sbin/pct"
66

7-
func Pct(args ...string) *exec.Cmd {
7+
func PctCmd(args ...string) *exec.Cmd {
88
return exec.Command(PctPath, args...)
99
}
1010

11-
func Stop(vmid string) *exec.Cmd {
12-
return Pct("stop", vmid)
11+
func StopCmd(vmid string) *exec.Cmd {
12+
return PctCmd("stop", vmid)
1313
}

0 commit comments

Comments
 (0)