Support running shell scripts

When rerunning the command, kill the whole child process group instead of only the direct child process to support running a shell script as the command
this could be more cleanly expressed:

```
   errc := make(chan error, 1)
   go func() {
       if err := syscall.Kill(...sigint...); err != nil; {
           errc <- err
           return
       }
       errc <- cmd.Wait()
   }()

   select {
   case <-time.After(3*time.Second):
        err = syscall.Kill(-pgid, syscall.SIGKILL)
   case err = <-errc:
   }
   return err
```