## What's new - color completion message command green https://github.com/versenilvis/IRIS/pull/10/commits/6e141f5e6909fad1ec42725cce38d51729acf399 - new flat command folder structure https://github.com/versenilvis/IRIS/pull/10/commits/87026a854a529ec5d5baed967d5f7a7f0085a24b - fix some linter problems https://github.com/versenilvis/IRIS/pull/10/commits/536de790cefda912f50bf4022e40ce2b965db2e2 - fix some gemini fix suggestions
110 lines
2.7 KiB
Go
110 lines
2.7 KiB
Go
package sys
|
|
|
|
import (
|
|
"context"
|
|
"os/exec"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/versenilvis/iris/commands/core"
|
|
)
|
|
|
|
func processGenerator(tokens []string, _ string, _ string) []core.Suggestion {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
// output: "pid command"
|
|
cmd := exec.CommandContext(ctx, "ps", "-eo", "pid,comm")
|
|
out, err := cmd.Output()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
seen := make(map[string]bool)
|
|
var results []core.Suggestion
|
|
for _, line := range strings.Split(string(out), "\n") {
|
|
line = strings.TrimSpace(line)
|
|
if line == "" {
|
|
continue
|
|
}
|
|
parts := strings.Fields(line)
|
|
if len(parts) < 2 {
|
|
continue
|
|
}
|
|
pid := parts[0]
|
|
if pid[0] < '0' || pid[0] > '9' {
|
|
continue
|
|
}
|
|
name := parts[1]
|
|
|
|
// suggest both PID and process name
|
|
if !seen[pid] {
|
|
seen[pid] = true
|
|
results = append(results, core.Suggestion{Cmd: pid, Desc: name})
|
|
}
|
|
}
|
|
return results
|
|
}
|
|
|
|
func init() {
|
|
core.Register(&core.Spec{
|
|
Name: "ps",
|
|
Description: "report processes",
|
|
Options: []core.Option{
|
|
{Name: "-e", Description: "all processes"},
|
|
{Name: "-f", Description: "full format"},
|
|
{Name: "-u", Description: "by user"},
|
|
{Name: "aux", Description: "all + user + x"},
|
|
{Name: "-o", Description: "custom format"},
|
|
{Name: "--pid", Description: "filter by PID"},
|
|
{Name: "--sort", Description: "sort by field"},
|
|
},
|
|
})
|
|
|
|
core.Register(&core.Spec{
|
|
Name: "kill",
|
|
Description: "send signal to process",
|
|
Generator: processGenerator,
|
|
Options: []core.Option{
|
|
{Name: "-9", Description: "SIGKILL (force)"},
|
|
{Name: "-15", Description: "SIGTERM (graceful)"},
|
|
{Name: "-2", Description: "SIGINT"},
|
|
{Name: "-HUP", Description: "SIGHUP (reload)"},
|
|
{Name: "-l", Description: "list signal names"},
|
|
},
|
|
})
|
|
|
|
core.Register(&core.Spec{
|
|
Name: "killall",
|
|
Description: "kill by process name",
|
|
Generator: processGenerator,
|
|
Options: []core.Option{
|
|
{Name: "-9", Description: "SIGKILL"},
|
|
{Name: "-s", Description: "specify signal"},
|
|
{Name: "-u", Description: "only for user"},
|
|
{Name: "-i", Description: "confirm each"},
|
|
},
|
|
})
|
|
|
|
core.Register(&core.Spec{
|
|
Name: "pkill",
|
|
Description: "kill by pattern",
|
|
Options: []core.Option{
|
|
{Name: "-9", Description: "SIGKILL"},
|
|
{Name: "-f", Description: "match full command"},
|
|
{Name: "-u", Description: "match by user"},
|
|
},
|
|
})
|
|
|
|
core.Register(&core.Spec{
|
|
Name: "pgrep",
|
|
Description: "find process by pattern",
|
|
Options: []core.Option{
|
|
{Name: "-l", Description: "list name and PID"},
|
|
{Name: "-f", Description: "match full command"},
|
|
{Name: "-u", Description: "match by user"},
|
|
{Name: "-a", Description: "list command line"},
|
|
},
|
|
})
|
|
}
|