有时候,我们可能会遇到开启多进程的场景 。因为开启新进程依赖系统调用,所以一般语言都会提供相应的封装 。那么 Go 中是怎么做的呢?
文章插图
如何在 Go 中运行一个外部命令有时我们会遇到这样的需求,在一个主进程中启动另外一个进程,而在 Go 中可以使用 exec 包的 Cmd 来轻松实现这类需求,示例代码如下:
文章插图
这段代码的含义是: 使用 nc -u -l 8080 来模拟一个常驻进程,然后通过 Go 的 exec.Cmd 来运行它,并且 Go 代码不退出,运行代码:
$ go run main.goStart child process with pid 32512输出结果表明我们已经通过 Go 成功调用外部命令,起了一个子进程,其进程号为 32512,我们还可以通过命令 ps -ef | grep 32512 来确认:
UID PID PPID C STIME TTY TIME CMDxxx 32512 32511 0 3:36PM ttys008 0:00.00 -u -l 8080如何结束子进程
- 首先想到的就是 kill 命令,尝试使用 kill 32512
- 使用 Go 代码结束该进程
// After five second, kill cmd's processtime.Sleep(5 * time.Second)cmd.Process.Kill()重新运行代码,发现 5 秒过后,该子进程还在 。其实调用 cmd.Process.Kill() 和外部使用 kill 命令是一样的,父进程还没有释放资源,所以子进程不能清理完成 。
- 使用 cmd.Wait() 完成资源清理,修改后的完整代码如下:
文章插图
运行代码,可以得到如下结果:
$ go run main.goStart child process with pid 41666Child process 41666 exit with err: signal: killed再通过 ps -ef | grep 41666 命令确认子进程 41666 已不存在 。
结语Go 中 exec.Cmd 封装的很好,对于外部命令调用非常方便,但是使用它的时候,需要注意对子进程的资源进行释放,其关键函数就是 cmd.Wait(), 所以用到 cmd 的地方,一定添加 cmd.Wait() 的逻辑 。
【Go 中如何优雅关闭子进程?】
推荐阅读
- 如何排查常见挖矿木马
- 国内顶尖大佬整理的Python入门教程完整版!懂中文就能学会
- JavaScript 究竟是如何工作的?
- 在Python中定义Main函数
- 春季如何正确保养皮肤 春季如何保养皮肤
- 男人春季进补吃什么好 男人春季吃什么进补
- 饮食|减肥中怎么样才能控制食欲?
- 化妆|海外华人喜爱的10款国货护肤品 效果好成分好 说我们身在福中不知福
- 白琳工夫的生长环境如何
- 中式家具十大品牌排名