我正在使用自动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))
答案 0 :(得分:0)
从sh启动子进程时,它将等待子进程退出(使用waitpid()
之类的东西),然后立即返回。即使sh返回到提示符,子进程的stdout和stderr(及其所有子进程)也将直接写到您的终端(而不是通过sh)。 .Start()
也会这样做。
使用.CombinedOutput()
时,要等到启动的进程(以及继承该进程的所有子进程)的stdout和stderr关闭。即使您的直接子进程(runc start
)退出了,它启动的容器可能仍然具有stdout和stderr的副本并正在写入它们,因此.CombinedOutput()
在确定所有副本之前无法返回这些文件已关闭。