github.com/pdmccormick/importable-docker-buildx@v0.0.0-20240426161518-e47091289030/monitor/commands/ps.go (about) 1 package commands 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 "text/tabwriter" 8 9 "github.com/docker/buildx/monitor/types" 10 "github.com/pkg/errors" 11 ) 12 13 type PsCmd struct { 14 m types.Monitor 15 stdout io.WriteCloser 16 } 17 18 func NewPsCmd(m types.Monitor, stdout io.WriteCloser) types.Command { 19 return &PsCmd{m, stdout} 20 } 21 22 func (cm *PsCmd) Info() types.CommandInfo { 23 return types.CommandInfo{ 24 Name: "ps", 25 HelpMessage: `list processes invoked by "exec". Use "attach" to attach IO to that process`, 26 HelpMessageLong: ` 27 Usage: 28 ps 29 `, 30 } 31 } 32 33 func (cm *PsCmd) Exec(ctx context.Context, args []string) error { 34 ref := cm.m.AttachedSessionID() 35 if ref == "" { 36 return errors.Errorf("no attaching session") 37 } 38 plist, err := cm.m.ListProcesses(ctx, ref) 39 if err != nil { 40 return err 41 } 42 tw := tabwriter.NewWriter(cm.stdout, 1, 8, 1, '\t', 0) 43 fmt.Fprintln(tw, "PID\tCURRENT_SESSION\tCOMMAND") 44 for _, p := range plist { 45 fmt.Fprintf(tw, "%-20s\t%v\t%v\n", p.ProcessID, p.ProcessID == cm.m.AttachedPID(), append(p.InvokeConfig.Entrypoint, p.InvokeConfig.Cmd...)) 46 } 47 tw.Flush() 48 return nil 49 }