Запуск контейнера runc go-lang deattached mode

Я тестирую время запуска контейнера runc, используя автоматический скрипт go lang, мой код подобен приведенному ниже, и он продолжает блокировать процесс, даже если он выполняется без блокировки в оболочке.

    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 ответов

Когда вы запускаете подпроцесс из sh, он ожидает завершения дочернего процесса (используя что-то вроде waitpid()), а затем сразу же возвращается. Stdout и stderr подпроцесса (и все его дочерние элементы) будут записаны непосредственно в ваш терминал (не через sh), даже после того, как sh вернется в приглашение. Это также то, что .Start() сделал бы.

Когда вы используете .CombinedOutput()вы ждете, пока stdout и stderr запущенного процесса (и все подпроцессы, которые его наследуют) закрываются. Даже если ваш непосредственный дочерний процесс (runc start), контейнер, который он запускает, все еще может иметь копии stdout и stderr и записывать их, поэтому .CombinedOutput() не может вернуться, пока не будет уверен, что все копии этих файлов закрыты.

Другие вопросы по тегам