Запуск контейнера 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()
не может вернуться, пока не будет уверен, что все копии этих файлов закрыты.