func()

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()
	}
}