github.com/rootless-containers/rootlesskit/v2@v2.3.4/pkg/common/exec.go (about) 1 package common 2 3 import ( 4 "errors" 5 "io" 6 "os/exec" 7 "syscall" 8 9 "github.com/sirupsen/logrus" 10 ) 11 12 // ErrorWithSys is implemented by *exec.ExitError and *child.reaperErr 13 type ErrorWithSys interface { 14 error 15 Sys() interface{} 16 } 17 18 func GetExecExitStatus(err error) (int, bool) { 19 err = errors.Unwrap(err) 20 if err == nil { 21 return 0, false 22 } 23 exitErr, ok := err.(ErrorWithSys) 24 if !ok { 25 return 0, false 26 } 27 status, ok := exitErr.Sys().(syscall.WaitStatus) 28 if !ok { 29 return 0, false 30 } 31 return status.ExitStatus(), true 32 } 33 34 func Execs(o io.Writer, env []string, cmds [][]string) error { 35 for _, cmd := range cmds { 36 var args []string 37 if len(cmd) > 1 { 38 args = cmd[1:] 39 } 40 x := exec.Command(cmd[0], args...) 41 x.Stdin = nil 42 x.Stdout = o 43 x.Stderr = o 44 x.Env = env 45 x.SysProcAttr = &syscall.SysProcAttr{ 46 Pdeathsig: syscall.SIGKILL, 47 } 48 logrus.Debugf("executing %v", cmd) 49 if err := x.Run(); err != nil { 50 return err 51 } 52 } 53 return nil 54 }