我正在使用一个自动的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))发布于 2019-01-03 06:54:22
当您从sh启动一个子进程时,它会等待该子进程退出(使用类似waitpid()的命令),然后立即返回。子进程(及其所有子进程)的stdout和stderr将直接写入您的终端(而不是通过sh),即使在sh返回到提示符后也是如此。这也是.Start()会做的事情。
使用.CombinedOutput()时,要等到已启动进程(以及继承它的所有子进程)的stdout和stderr关闭。即使您的直接子进程(runc start)退出,它启动的容器可能仍然具有标准输出和标准错误的副本,并且正在向它们写入数据,因此.CombinedOutput()在确定这些文件的所有副本都已关闭之前不能返回。
https://stackoverflow.com/questions/37420728
复制相似问题