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

背景

最近在开发一个监控数据的采集模块,其中需要用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这个数字。从此处就可以推断出来,用此种方案来设置执行程序的超时时间显然看起来是有问题的,还是不能避免程序保持在一个稳定的状态。
如果大家有更好的方法,欢迎一起讨论 … _

测试代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,463评论 19 139
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 10,258评论 0 11
  • 一、shell脚本介绍 1.1 开头(环境使用shebang机制) #!/bin/bash 必须写在文件首行 符号...
    优果馥斯阅读 8,742评论 0 1
  • 控制并发有三种种经典的方式,一种是通过channel通知实现并发控制 一种是WaitGroup,另外一种就是Con...
    wiseAaron阅读 13,638评论 4 34
  • by 忆水寒的清浅拾光 我们都知道,人与人之间的沟通,内容所占的比重很小很小,而情绪和肢体语言则是人们关注的焦点,...
    忆水寒的清浅拾光阅读 8,068评论 8 7