Hi. I faced a strange problem on Windows. Consider the following code:

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


It launched the calc process after which tries to kill it firstly by 
calling Kill() and next by calling taskkill Windows command. Both fails due 
to wrong PID. 
Next (for loop) we try to find the right PID manually via tasklist. After 
that we assign the found PID to cmd.Process.Pid, call Kill() and it is 
success. 

For me this entire process produces the following output: 

cmd.Process.Pid: 12704
>>1 TerminateProcess: Access is denied.
>>2 exit status 128
matching string:
calculator.exe               11316 console                    1    53�284 ��
Real PID is: 11316
Killed: no error

And calc's window really appears and next disappears as the process being 
killed. 

Also tested Kill() on Ubuntu, it works nominal without such ugly things. 

So what's the heck? 

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to