我是一个golang新手,目前遇到了一个问题。先上代码
```go
func main() {
cancelFunc, err := tool.ExecCommand("ping -t www.baidu.com")
if err != nil {
if cancelFunc != nil {
cancelFunc()
}
logger.Printf("%v", err)
} else {
time.Sleep(12 * time.Second)
cancelFunc()
}
logger.Println("================")
time.Sleep(12 * time.Second)
logger.Println("end")
}
func ExecCommand(cmd string) (context.CancelFunc, error) {
ctx, cancel := context.WithCancel(context.TODO())
process := exec.CommandContext(ctx, "cmd", "/c", cmd)
output, err := process.StdoutPipe()
if err != nil {
logger.Printf("命令执行异常:%v", err)
if cancel != nil {
cancel()
}
return nil, err
}
err = process.Start()
if err != nil {
logger.Printf("命令执行异常:%v", err)
if cancel != nil {
cancel()
}
return nil, err
}
go func() {
logger.Printf("进程PID:%d", process.Process.Pid)
defer func(proc *os.Process) {
pid := proc.Pid
err := proc.Kill()
if err != nil {
logger.Printf("关闭进程失败,PID:%d,%s", pid, err)
}
}(process.Process)
reader := bufio.NewReader(output)
for {
select {
case <-ctx.Done():
logger.Printf("命令执行完毕!")
return
default:
line, err := reader.ReadString('\n')
if err != nil || err == io.EOF {
return
}
logger.Printf("%s", line)
}
}
}()
return cancel, err
}
```
我遇到的问题是,就上述代码,我运行一个ping -t的命令做测试,在这个方法外部十秒后调用了cancelFunc,程序是停了,golang启动的叫做Console的进程也停了,但是操作系统上依然有一个叫做PING的进程一直在执行没有结束。
我想向各位大佬请教一下,怎样在能在这个process退出时,让它启动的ping命令也结束运行。当然了,这个Ping只是一个例子,代指被exec.Command启动的操作系统上的程序。先在这里谢过了。
我本来是没写kill的,但是发现有系统进程残留,就试了试这个kill,发现他关掉的是Console,不写这个其实也会关掉。只是没有删除它。还有我来发帖我肯定已经在网上找了很久的答案了呀,但是没找到解决办法,没有类似的问题描述。
#2
更多评论