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