我想按需取消正在运行的命令,为此,我正在尝试,exec.CommandContext
目前正在尝试:
https://play.golang.org/p/0JTD9HKvyad
package main
import (
"context"
"log"
"os/exec"
"time"
)
func Run(quit chan struct{}) {
ctx, cancel := context.WithCancel(context.Background())
cmd := exec.CommandContext(ctx, "sleep", "300")
err := cmd.Start()
if err != nil {
log.Fatal(err)
}
go func() {
log.Println("waiting cmd to exit")
err := cmd.Wait()
if err != nil {
log.Println(err)
}
}()
go func() {
select {
case <-quit:
log.Println("calling ctx cancel")
cancel()
}
}()
}
func main() {
ch := make(chan struct{})
Run(ch)
select {
case <-time.After(3 * time.Second):
log.Println("closing via ctx")
ch <- struct{}{}
}
}
我面临的问题是被cancel()
调用但进程没有被杀死,我的猜测是主线程先退出并且不等待cancel()
正确终止命令,主要是因为如果我time.Sleep(time.Second)
在最后使用 amain
它退出/终止正在运行的命令的功能。
关于如何wait
确保在不使用 a 退出之前命令已被终止的任何想法sleep
?cancel()
成功杀死命令后可以在频道中使用吗?
在尝试使用单个 goroutine 时,我尝试了这个:https://play.golang.org/p/r7IuEtSM-gL但是cmd.Wait()
似乎一直在阻塞select
并且无法调用cancel()
慕容708150
相关分类