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  }