golang exec 不正确的行为
golang exec incorrect behavior
我正在使用以下代码段获取虚拟机 运行ning 在 XEN Hypervisor
上的 XML
定义。该代码正在尝试执行命令 virsh dumpxml Ubutnu14
,这将给出名为 Ubuntu14
的 VM 的 XML
virshCmd := exec.Command("virsh", "dumpxml", "Ubuntu14")
var virshCmdOutput bytes.Buffer
var stderr bytes.Buffer
virshCmd.Stdout = &virshCmdOutput
virshCmd.Stderr = &stderr
err := virshCmd.Run()
if err != nil {
fmt.Println(err)
fmt.Println(stderr.String())
}
fmt.Println(virshCmdOutput.String())
这段代码总是进入给定域名的错误条件,我得到以下输出。
exit status 1
error: failed to get domain 'Ubuntu14'
error: Domain not found: no domain with matching name 'Ubuntu14'
但是如果我 运行 独立命令 virsh dumpxml Ubuntu14
,我会得到正确的 XML
定义。
如果有人能给我一些关于我做错了什么的提示,我将不胜感激。我的主机是 Ubuntu-16.04
并且 golang
版本是 go1.6.2 linux/amd64
我希望您在这两种情况下 运行将 virsh 作为不同的用户使用,并且由于您没有提供任何 URI,它正在连接到不同的 libvirtd 实例。如果您 运行 virsh as non-root,那么它通常会连接到 qemu:///session,但是如果您 运行 virsh as root,那么它通常会连接到 qemu: ///系统。针对一个 URI 注册的 VM 在连接到另一个 URI 时将不可见。
顺便说一句,如果您使用的是 go,最好使用 libvirt 的本机 Go 库绑定,而不是执行 virsh。您的 "virsh dumpxml" 调用几乎等同于此:
import (
"github.com/libvirt/libvirt-go"
)
conn, err := libvirt.NewConnect("qemu:///system")
dom, err := conn.LookupDomainByName("Ubuntu14")
xml, err := dom.GetXMLDesc(0)
(显然也要进行错误处理)
我正在使用以下代码段获取虚拟机 运行ning 在 XEN Hypervisor
上的 XML
定义。该代码正在尝试执行命令 virsh dumpxml Ubutnu14
,这将给出名为 Ubuntu14
XML
virshCmd := exec.Command("virsh", "dumpxml", "Ubuntu14")
var virshCmdOutput bytes.Buffer
var stderr bytes.Buffer
virshCmd.Stdout = &virshCmdOutput
virshCmd.Stderr = &stderr
err := virshCmd.Run()
if err != nil {
fmt.Println(err)
fmt.Println(stderr.String())
}
fmt.Println(virshCmdOutput.String())
这段代码总是进入给定域名的错误条件,我得到以下输出。
exit status 1
error: failed to get domain 'Ubuntu14'
error: Domain not found: no domain with matching name 'Ubuntu14'
但是如果我 运行 独立命令 virsh dumpxml Ubuntu14
,我会得到正确的 XML
定义。
如果有人能给我一些关于我做错了什么的提示,我将不胜感激。我的主机是 Ubuntu-16.04
并且 golang
版本是 go1.6.2 linux/amd64
我希望您在这两种情况下 运行将 virsh 作为不同的用户使用,并且由于您没有提供任何 URI,它正在连接到不同的 libvirtd 实例。如果您 运行 virsh as non-root,那么它通常会连接到 qemu:///session,但是如果您 运行 virsh as root,那么它通常会连接到 qemu: ///系统。针对一个 URI 注册的 VM 在连接到另一个 URI 时将不可见。
顺便说一句,如果您使用的是 go,最好使用 libvirt 的本机 Go 库绑定,而不是执行 virsh。您的 "virsh dumpxml" 调用几乎等同于此:
import (
"github.com/libvirt/libvirt-go"
)
conn, err := libvirt.NewConnect("qemu:///system")
dom, err := conn.LookupDomainByName("Ubuntu14")
xml, err := dom.GetXMLDesc(0)
(显然也要进行错误处理)