go执行shell命令
其实在之前的项目中,就有运用到调用linux中的命令,例如,借鉴falcon,里面agent更新文件是调用的wget去获取server端目录下的agent
的tar
包。
基础任务调用
按道理来讲,官方库os/exec
已经将这个操作封装得很好了,我们所需要做的,也就是调用API进行操作即可,这里插入一些关于API调用的流程问题。
这是一个基础的调用命令的使用方式:
1 | func main() { |
其实,它借用到了Linux的进程的相关函数操作,如图:
也就是说,golang在调用fork,其与子进程通过管道进行了相应的连接,这是linux的基础知识——进程间通信(感觉回到了嵌入式)。
也就是相当于go
写入一个command
交给子进程去运行,然后结果被子进程输入管道,go
会去读取。
系统调用阶段会使用到:
1 | pipe():创建2个文件描述符,fd[0]可读,fd[1]可写 |
这种调用其实是非常占用空间的,子进程会共享父进程的代码空间,数据空间则互相独立,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同。也就是这个的消耗资源也就是比协程消耗得更多的,基本相当于线程对协程而言了。
强制结束任务
在实际使用中,我们需要控制任务的生命周期,有时候,我们并不需要任务继续执行下去了,这时候,我们就要使点手段来结束掉任务。
可以使用如下:
1 | package main |
注意:若你在windows下运行该命令,运行得到的结果是(go1.11,go1.12,这俩版本linux不会出现这种情况):
1 | exit status 1 hello |
也就是说程序虽然被kill掉了,但命令还是执行了。
博客:golang的CommandContext取消不退出问题,介绍的是在go1.10中,Linux下运行命令无法终止的情况(go1.11已被修复),但博客中有提到一个issue,该地址里有介绍到windows相关,我未深究这个问题的解决,毕竟我没在windows下的使用环境(大概都是运行在linux下的吧)。
这里还是提一下这个问题,望了解。
本文标题:go执行shell命令
文章作者:小师
发布时间:2019-03-22
最后更新:2022-05-04
原始链接:chunlife.top/2019/03/22/go执行shell命令/
版权声明:本站所有文章均采用知识共享署名4.0国际许可协议进行许可