有时我们会遇到这样的需求,在一个主进程中启动另外一个进程,而在 Go 中可以使用 exec 包的 Cmd 来轻松实现这类需求,例如代码:
package main
import (
"fmt"
"log"
"os"
"os/exec"
"os/signal"
)
func main() {
cmd := exec.Cmd{
Path: "nc",
Args: []string{"-u", "-l", "8888"},
Dir: "/usr/bin",
}
if err := cmd.Start(); err != nil {
log.Panic(err)
}
fmt.Println("Start child process with pid", cmd.Process.Pid)
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
s := <-c
fmt.Println("Got signal:", s)
}
这段代码的含义是: 使用 nc -u -l 8888 来模拟一个常驻进程,然后通过 Go 的 exec.Cmd 来运行它,并且 Go 代码不退出,运行代码:
$ go run main.go
Start child process with pid 35904
输出结果表明我们已经通过 Go 成功调用外部命令,起了一个子进程,其进程号为