Go 进程执行

在上面的例子中,我们演示了一下如何去触发执行一个外部的进程。我们这样做的原因是我们希望从Go进程里面可以访问外部进程的信息。但有的时候,我们仅仅希望执行一个外部进程来替代当前的Go进程。这个时候,我们需要使用Go提供的exec函数。

  1. package main
  2. import "syscall"
  3. import "os"
  4. import "os/exec"
  5. func main() {
  6. // 本例中,我们使用`ls`来演示。Go需要一个该命令
  7. // 的完整路径,所以我们使用`exec.LookPath`函数来
  8. // 找到它
  9. binary, lookErr := exec.LookPath("ls")
  10. if lookErr != nil {
  11. panic(lookErr)
  12. }
  13. // `Exec`函数需要一个切片参数,我们给ls命令一些
  14. // 常见的参数。注意,第一个参数必须是程序名称
  15. args := []string{"ls", "-a", "-l", "-h"}
  16. // `Exec`还需要一些环境变量,这里我们提供当前的
  17. // 系统环境
  18. env := os.Environ()
  19. // 这里是`os.Exec`调用。如果一切顺利,我们的原
  20. // 进程将终止,然后启动一个新的ls进程。如果有
  21. // 错误发生,我们将获得一个返回值
  22. execErr := syscall.Exec(binary, args, env)
  23. if execErr != nil {
  24. panic(execErr)
  25. }
  26. }

运行结果

  1. total 16
  2. drwxr-xr-x 4 mark 136B Oct 3 16:29 .
  3. drwxr-xr-x 91 mark 3.0K Oct 3 12:50 ..
  4. -rw-r--r-- 1 mark 1.3K Oct 3 16:28 execing-processes.go

注意,Go没有提供Unix下面经典的fork函数。通常这也不是一个问题,因为进程触发和进程执行已经覆盖了fork的大多数功能。