• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

【转】Go 中如何优雅关闭子进程?

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

原文:https://www.toutiao.com/i6699252793120653838/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1626964317&app=news_article&utm_source=weixin&utm_medium=toutiao_android&use_new_style=1&req_id=20210722223157010150217149410EC3CA&share_token=1e770098-acdd-44ea-9845-551b3359fe50&group_id=6699252793120653838&wid=1627003599406

--------------------

有时候,我们可能会遇到开启多进程的场景。因为开启新进程依赖系统调用,所以一般语言都会提供相应的封装。那么 Go 中是怎么做的呢?

 

有时我们会遇到这样的需求,在一个主进程中启动另外一个进程,而在 Go 中可以使用 exec 包的 Cmd 来轻松实现这类需求,示例代码如下:

 

这段代码的含义是: 使用 nc -u -l 8080 来模拟一个常驻进程,然后通过 Go 的 exec.Cmd 来运行它,并且 Go 代码不退出,运行代码:

$ go run main.go
Start child process with pid 32512

输出结果表明我们已经通过 Go 成功调用外部命令,起了一个子进程,其进程号为 32512,我们还可以通过命令 ps -ef | grep 32512 来确认:

 UID PID PPID C STIME TTY TIME CMD
xxx 32512 32511 0 3:36PM ttys008 0:00.00 -u -l 8080

如何结束子进程

  • 首先想到的就是 kill 命令,尝试使用 kill 32512
$ kill 32512
$ ps -ef | grep 32512
UID PID PPID C STIME TTY TIME CMD
2062309935 35904 35903 0 3:36PM ttys008 0:00.00 (nc)

发现 kill 命令并不好用,进程还在,然后换成 kill -9 也同样不起作用。不过该进程已经停止运行了,可以看到监听由 0:00.00 -u -l 8888 变成了 0:00.00 (nc), 不再监听 8888 端口,只是进程资源还没释放而已。

  • 使用 Go 代码结束该进程

因为 Go 的 Cmd 内置了 Process.Kill() 函数,我们可以尝试使用它来关闭子进程,修改代码,添加如下内容:

// After five second, kill cmd's process
time.Sleep(5 * time.Second)
cmd.Process.Kill()

重新运行代码,发现 5 秒过后,该子进程还在。其实调用 cmd.Process.Kill() 和外部使用 kill 命令是一样的,父进程还没有释放资源,所以子进程不能清理完成。

  • 使用 cmd.Wait() 完成资源清理,修改后的完整代码如下:

 

运行代码,可以得到如下结果:

$ go run main.go
Start child process with pid 41666
Child process 41666 exit with err: signal: killed

再通过 ps -ef | grep 41666 命令确认子进程 41666 已不存在。

结语

Go 中 exec.Cmd 封装的很好,对于外部命令调用非常方便,但是使用它的时候,需要注意对子进程的资源进行释放,其关键函数就是 cmd.Wait(), 所以用到 cmd 的地方,一定添加 cmd.Wait() 的逻辑。


参考链接:

  • https://golang.org/pkg/os/exec/#Cmd.Wait

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go 语言中windows Linux 交叉编译发布时间:2022-07-10
下一篇:
****-分布式mapreduce与raft与分布式数据库-Go语言发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap