github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/processes/kill.go (about) 1 package processes 2 3 import ( 4 "fmt" 5 6 "github.com/lmorg/murex/lang" 7 "github.com/lmorg/murex/lang/types" 8 ) 9 10 func init() { 11 lang.DefineFunction("fid-kill", cmdFidKill, types.Null) 12 lang.DefineFunction("fid-killall", cmdKillAll, types.Null) 13 } 14 15 func cmdFidKill(p *lang.Process) error { 16 p.Stdout.SetDataType(types.Null) 17 18 for i := 0; i < p.Parameters.Len(); i++ { 19 fid, err := p.Parameters.Uint32(i) 20 if err != nil { 21 return err 22 } 23 24 process, err := lang.GlobalFIDs.Proc(fid) 25 if err != nil { 26 return err 27 } 28 29 if process.Kill != nil { 30 process.Kill() 31 } else { 32 return fmt.Errorf("fid `%d` cannot be killed. `Kill` method == `nil`", fid) 33 } 34 } 35 36 return nil 37 } 38 39 func cmdKillAll(*lang.Process) error { 40 fids := lang.GlobalFIDs.ListAll() 41 for _, p := range fids { 42 if p.Kill != nil /*&& !p.HasTerminated()*/ { 43 procName := p.Name.String() 44 procParam, _ := p.Parameters.String(0) 45 if procName == "exec" { 46 procName = procParam 47 procParam, _ = p.Parameters.String(1) 48 } 49 if len(procParam) > 10 { 50 procParam = procParam[:10] 51 } 52 lang.ShellProcess.Stderr.Write([]byte(fmt.Sprintf("!!! Sending kill signal to fid %d: %s %s !!!\n", p.Id, procName, procParam))) 53 p.Kill() 54 } 55 } 56 57 return nil 58 }