1

我正在使用自动 go lang 脚本测试 runc 容器启动时间,我的代码如下所示,即使它在 shell 中没有阻塞地运行,它也会一直阻塞进程。

    command := exec.Command("runc","start","-d","redis")
    command.Dir = "/containers/redis"
    start := time.Now() 
    r,err:=command.CombinedOutput()
    duration:= time.Since(start)/time.Millisecond
    fmt.Println(duration)   
    fmt.Println(err) 
    fmt.Println(string(r))
4

1 回答 1

0

当您从 sh 启动子进程时,它会等待子进程退出(使用类似的东西waitpid()),然后立即返回。子进程(及其所有子进程)的 stdout 和 stderr 将直接写入您的终端(而不是通过 sh),即使在 sh 返回到提示符之后也是如此。这也是.Start()会做的。

当您使用 时.CombinedOutput(),您将等到已启动进程(以及继承它的所有子进程)的 stdout 和 stderr 关闭。即使您的直接子进程 ( runc start) 退出,它启动的容器可能仍然具有 stdout 和 stderr 的副本并正在写入它们,因此.CombinedOutput()在确定这些文件的所有副本都已关闭之前无法返回。

于 2019-01-02T22:54:22.400 回答