golang代码中调用Linux命令.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

golang代码中调用Linux命令

目录传统方案--crontab分布式任务调度go执行shell命令实际我们在golang代码中调用Linux命令1、普通调用2、结合协程调用,可控制中断调用

传统方案--crontab

缺点配置任务时,需要SSh登录脚本服务器进行操作服务器宕机,任务将终止调度,需要人工迁移排查问题低效,无法方便的查看任务状态与错误输出

分布式任务调度

优点可视化Web后台,方便进行任务管理分布式架构、集群化调度,不存在单点故障追踪任务执行状态,采集任务输出,可视化log查看

go执行shell命令

1、执行程序:/usr/bin/pythonstart.py

2、调用命令:catnginx.log|grep2025

bash模式交互模式:ls-l非交互模式:/bin/bash-cls-l------我们使用这个

实际我们在golang代码中调用Linux命令

1、普通调用

packagemain

import(

fmt

os/exec

var(

output[]byte

errerror

funcmain(){

//要执行的命令

cmd:=exec.Command(bash.exe,-c,echo111)

//CombinedOutput--捕获异常跟命令输出的内容

ifoutput,err=cmd.CombinedOutput();err!=nil{

fmt.Println(erroris:,err)

return

//打印输出结果

fmt.Println(string(output))

2、结合协程调用,可控制中断调用

packagemain

import(

context

fmt

os/exec

time

//接收子协程的数据,协程之间用chan通信

typeresultstruct{

output[]byte

errerror

funcmain(){

//执行一个cmd,让他在一个携程里面执行2s,

//1s的时候杀死cmd

var(

ctxcontext.Context

cancelFunccontext.CancelFunc

cmd*exec.Cmd

resultChanchan*result

res*result

//创建一个结果队列

resultChan=make(chan*result,1000)

1.WithCancel()函数接受一个Context并返回其子Context和取消函数cancel

2.新创建协程中传入子Context做参数,且需监控子Context的Done通道,若收到消息,则退出

3.需要新协程结束时,在外面调用cancel函数,即会往子Context的Done通道发送消息

4.注意:当父Context的Done()关闭的时候,子ctx的Done()也会被关闭

ctx,cancelFunc=context.WithCancel(context.TODO())

//起一个协程

gofunc(){

var(

output[]byte

errerror

//生成命令

cmd=exec.CommandContext(ctx,bash,-c,sleep3;echohello;)

//执行命令cmd.CombinedOutput(),且捕获输出

output,err=cmd.CombinedOutput()

//用chan跟主携程通信,把任务输出结果传给main协程

resultChan-result{

err:err,

output:output,

//Sleep1s

time.Sleep(time.Second*1)

//取消上下文,取消子进程,子进程就会被干掉

cancelFunc()

//从子协程中取出数据

res=-resultChan

//打印子协程中取出数据

fmt.Println(res.err)

fmt.Println(string(res.output))

}

文档评论(0)

135****5541 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档