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