内容目录
以 Linux 为例,在 Go 中调用一个命令行程序,其代码示例如下:
package main
import (
"log"
"os"
"os/exec"
)
func main() {
cmd := exec.Command("top")
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
log.Fatal(err)
}
}
首先使用 cmd := exec.Command("top")
加入需要使用的命令行程序。
我们还可以设置其参数:
cmd := exec.Command("top","-n","1")
为了可以在 GO 程序中,“代理”命令行程序,用户在程序的控制台中执行命令或交互,跟直接执行命令是一致,需要将命令行的控制台 IO 设置为当前 Go 程序的控制台 IO。
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
另外,进行系统调用时,可以设置一些参数,例如 Linux 下,支持 namespace 等,那么我们可以实现类似 Docker 的进程隔离:
cmd.SysProcAttr = &syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC,
}
完整代码如下:
package main
import (
"log"
"os"
"os/exec"
"syscall"
)
func main() {
cmd := exec.Command("sh")
cmd.SysProcAttr = &syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC,
}
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
log.Fatal(err)
}
}
文章评论