golang 通过exec Command启动的进程如何关闭的解决办法

在用exec包调用的其他进程后如何关闭结束,可以使用context包的机制进行管理,context包的使用详见:https://godoc.org/context
exec.CommandContext方发实现了context,通过context可以对exec启动的进程结束。 隐藏程序自身黑窗口的方法:Go build -ldflags="-H windows" 隐藏子进程黑窗口的方法: cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}

package main

import (
    "context"
    "fmt"
    "os"
    "os/exec"
    "syscall"
    "time"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    cmd := exec.CommandContext(ctx, "./b")
    cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
    cmd.Stdout = os.Stdout
    cmd.Start()

    time.Sleep(10 * time.Second)
    fmt.Println("退出程序中...", cmd.Process.Pid)
    cancel()

    cmd.Wait()
}
已邀请:

SuperFashi - To code or be coded, that's a question.

赞同来自:

不用这么麻烦啊,直接cmd.Process.Kill()就好

fangniu - Gopher+Pythonista

赞同来自:

请问我使用os.exec 执行二进制文件,几十个到上百个协程并行一段时间后, “可执行文件”执行变成了僵尸进程是什么原因?

func collect() {
    done := make(chan error, 1)
    var out bytes.Buffer
    cmd := exec.Command("可执行文件", "参数")
    cmd.Stdout = &out
    err := cmd.Start()
    if err != nil {
        fmt.Println("命令执行失败", err)
        return
    }

    go func() {
        done <- cmd.Wait()
    }()

    select {
    case err := <-done:
        if err != nil {
            fmt.Println("wait失败: ", err)
            return
        }
        ......
    case <-time.After(execTimeout):
        ...
    }
}

pathbox - https://pathbox.github.io/

赞同来自:

一般 情况, cmd 执行完就进程结束了不是?

要回复问题请先登录注册