in pkg/procmanager/procmanager.go [116:170]
func (pm *ProcManager) Run(
ctx context.Context,
args []string,
stdIn io.Reader,
stdOut io.Writer,
stdErr io.Writer,
cmdDir string) error {
if pm.DryRun {
log.Printf("[DRY RUN] Args: %v\n", args)
return nil
}
if args == nil {
return nil
}
cmd := exec.Command(args[0], args[1:]...) //#nosec G204
if cmdDir != "" {
cmd.Dir = cmdDir
}
cmd.Stdin = stdIn
cmd.Stdout = stdOut
cmd.Stderr = stdErr
if err := cmd.Start(); err != nil {
return err
}
pid := cmd.Process.Pid
pm.mu.Lock()
pm.processes[pid] = cmd.Process
pm.mu.Unlock()
defer pm.DeletePid(pid)
errChan := make(chan error)
go func() {
errChan <- cmd.Wait()
}()
select {
case err := <-errChan:
return err
case <-ctx.Done():
go func() {
if err := cmd.Process.Kill(); err != nil {
log.Printf("Failed to kill process. Path: %s, Args: %v, Err: %v\n", cmd.Path, cmd.Args, err)
}
}()
return ctx.Err()
}
}