我正在使用自动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))

===============>>#1 票数:0

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

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

  ask by Docker hero translate from so

未解决问题?本站智能推荐: