golang为执行的脚本设置超时时间(Terminating a process started with os/exec in golang)

darren_gong · · 2816 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

背景

最近在开发一个监控数据的采集模块,其中需要用golang的os/exec包来执行脚本,考虑到用户编写的脚本可能会导致程序会阻塞住,所以需要为执行程序设置一个超时时间,本来以为这是非常简单的程序,可是没想到执行的效果远远不是我想要的(也有可能是知识储备不够……^ _ ^),所以这里想要把问题抛出来和大家一起探讨。

方案



简单解释下:
如果cmd.wait()函数放在了主程序中,一旦程序执行到这里,就会导致程序阻塞在这里,一直要等待cmd.wait()函数返回。所以将cmd.wiat()函数放置在另外一个goroutine中,用select{}方式来等待某一个case事件被触发。
channel done 表示由外部程序来终止shell process进程的执行。
channel errCh 表示由cmd.wait()函数返回。

执行效果

测试用例:
脚本内容: echo "test shell"

超时时间: 3 s



这样看起来似乎是没有问题的。
此时, 修改执行脚本的内容: sleep 10; echo "test shell"
, 在看下图:



通过日志可以看出来,goroutine的数量一直在增大,知道第一个脚本执行完成,所以后面goroutine的数量一直保持在13这个数字。从此处就可以推断出来,用此种方案来设置执行程序的超时时间显然看起来是有问题的,还是不能避免程序保持在一个稳定的状态。
如果大家有更好的方法,欢迎一起讨论 … ^_^

测试代码



有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2816 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传