package main
import (
"fmt"
"os/exec"
"regexp"
"strconv"
"strings"
"time"
)
func main() {
// execute the calc
cmd := exec.Command("calc")
if err := cmd.Start(); err != nil {
fmt.Println(">>0", err)
return
}
fmt.Println("cmd.Process.Pid:", cmd.Process.Pid)
time.Sleep(2 * time.Second)
// results in `>>1 TerminateProcess: Access is denied`
if err := cmd.Process.Kill(); err != nil {
fmt.Println(">>1", err)
}
// results in `>>2 exit status 128` which means no such process
if err := exec.Command("taskkill", "/F", "/PID", strconv.Itoa(cmd.Process.Pid)).Run(); err != nil {
fmt.Println(">>2", err)
}
// let's find the real PID by parsing tasklist output
b, _ := exec.Command("tasklist").CombinedOutput()
list := strings.Split(string(b), "\n")
var realPID int
for _, s := range list {
s = strings.ToLower(s)
if !strings.Contains(s, "calc") {
continue
}
fmt.Println("matching string:")
fmt.Println(s)
submatches := regexp.MustCompile(`^[\w\._\s+-]+?(\d+)`).FindStringSubmatch(s)
if len(submatches) != 2 {
fmt.Println(">>3 invalid len of submatches:", len(submatches))
return
}
var err error
realPID, err = strconv.Atoi(submatches[1])
if err != nil {
fmt.Println(">>4", err)
return
}
fmt.Println("Real PID is:", realPID)
}
cmd.Process.Pid = realPID
if err := cmd.Process.Kill(); err != nil {
fmt.Println(">>5", err)
return
}
fmt.Println("Killed: no error")
}