go-sh
go-sh copied to clipboard
go-sh包 ,用到DOCKER操作指令时是无信息返回的。
go-sh包 ,用到DOCKER操作指令时是无信息返回的。 觉得非常奇怪。 go-sh包所在程序在宿主机上运行,运行docker --help是可以正常获得反馈, 但是使用docker ps -a之类的指令时,是无反馈回来的, 而在cmd面板ssh操作是可以正常反馈的。 是跨容器导致了这个问题吗,有办法解决吗?很头大
-
`func shell(s string) (string, error){ //函数返回一个*Cmd,用于使用给出的参数执行name指定的程序 cmd := exec.Command("/bin/bash", "-c", s)
//读取io.Writer类型的cmd.Stdout,再通过bytes.Buffer(缓冲byte类型的缓冲器)将byte类型转化为string类型(out.String():这是bytes类型提供的接口) var out bytes.Buffer cmd.Stdout = &out
//Run执行c包含的命令,并阻塞直到完成。 这里stdout被取出,cmd.Wait()无法正确获取stdin,stdout,stderr,则阻塞在那了 err := cmd.Run() //checkErr(err) return out.String(), err }
`
我怀疑时cmd.Wait()这个函数无法正确获取到stdin,stdout了。 docker ps -a 或进入docker其他指令-it或加上/bin/bash的时候同样也是要调用到exec的。 估计是这个原因,问题是这个问题,真不知道怎么解决
在运行shell脚本时候,有三种方式来调用外部的脚本,exec(exec script.sh)、source(source script.sh)、fork(./script.sh) 1、exec(exec /home/script.sh):
使用exec来调用脚本,被执行的脚本会继承当前shell的环境变量。但事实上exec产生了新的进程,他会把主shell的进程资源占用并替换脚本内容,继承了原主shell的PID号,即原主shell剩下的内容不会执行。
DOCKER PS -A 命令应该是以一个新的shell来进行的 ,因为新的shell集成了原主shell, 所以导致了这个问题;我认为是这样