golang执行命令操作 exec.Command

我就废话不多说了,大家还是直接看代码吧~

cmd := exec.Command("cmd")
 in := bytes.NewBuffer(nil)
 cmd.Stdin = in//绑定输入
 var out bytes.Buffer
 cmd.Stdout = &out //绑定输出
 go func() {
 in.WriteString("node E:/design/test.js\n")//写入你的命令,可以有多行,"\n"表示回车
 }()
 err = cmd.Start()
 if err != nil {
 log.Fatal(err)
 }
 log.Println(cmd.Args)
 err = cmd.Wait()
 if err != nil {
 log.Printf("Command finished with error: %v", err)
 }
 fmt.Println(out.String())

补充:golang 执行外部命令 超时处理 exec.CommandContext

使用exec.CommandContext来处理外部命令的超时

func main() {
  timeout := 5
  ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeout+5)*time.Second)
  defer cancel()

  cmdarray := []string{"-c", fmt.Sprintf("%s %s", "sleep", "10")}
  cmd := exec.CommandContext(ctx, "bash", cmdarray...)
  out, err := cmd.CombinedOutput()

  //if ctx.Err() == context.DeadlineExceeded {}
  fmt.Printf("ctx.Err : [%v]\n", ctx.Err())
  fmt.Printf("error  : [%v]\n", err)
  fmt.Printf("out   : [%s]\n", string(out))
}

运行结果是:

ctx.Err : [context deadline exceeded]
error  : [signal: killed]
out   : []

如果是一个命令错误输出是什么:

下面这个例子是使用sleep不带参数,显示是错误的。

cmdarray := []string{"-c", fmt.Sprintf("%s %s", "sleep", "")}


ctx.Err : [<nil>]
error  : [exit status 1]
out   : [usage: sleep seconds
]

可以命令的执行错误不会导致ctx.Err()错误。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 浅谈golang类型断言,失败类型断言返回值问题

    失败的类型断言,返回的值为最近断言类型的零值 代码入下: func main() { var data interface{} = "ehoo" if res, ok := data.(int); ok { fmt.Printf("int res:%d\n", res) } else if res, ok := data.(bool); ok { fmt.Printf("bool res:%b\n", res) } else { fmt.Prin

  • 解决golang sync.Wait()不执行的问题

    goroutine 似乎不用解释太多,可以利用它实现多线程,也可以利用它来实现异步事件. 在使用关键字go的过程中,常常会将用到sync.WaitGroup,如下一段代码. package main import ( "fmt" "sync" "time" ) func Run() { var wg = &sync.WaitGroup{} go func() { wg.Add(1) fmt.Println("halo world

  • golang等待触发事件的实例

    我就废话不多说了,大家还是直接看代码吧~ type Wait interface { // Register waits returns a chan that waits on the given ID. // The chan will be triggered when Trigger is called with // the same ID. Register(id uint64) <-chan interface{} // Trigger triggers the waiting c

  • golang中sync.Map并发创建、读取问题实战记录

    背景: 我们有一个用go做的项目,其中用到了zmq4进行通信,一个简单的rpc过程,早期远端是使用一个map去做ip和具体socket的映射. 问题 大概是这样 struct SocketMap { sync.Mutex sockets map[string]*zmq4.Socket } 然后调用的时候的代码大概就是这样的: func (pushList *SocketMap) push(ip string, data []byte) { pushList.Lock() defer pushLi

  • 解决Golang map range遍历结果不稳定问题

    闲言少叙,本文主要是想介绍一个Golang开发常见的一个问题.然而,此问题对于初学者来说却经常容易陷入坑中. 问题 我在写一段代码时,使用了Golang的map数据结构,目的是想用map缓存计数结果.简单来说map的键也是整型的,且以递增顺序存储.我的最初想法是,在统计结束后,按照map中存储的键有序输出值.可是,当我运行程序时,结果并不是我想要的,而且有一定概率运行结果不同. 问题代码 func sortByBits(arr []int) []int { var bitmap = make(m

  • 快速解决Golang Map 并发读写安全的问题

    一.错误案例 package main import ( "fmt" "time" ) var TestMap map[string]string func init() { TestMap = make(map[string]string, 1) } func main() { for i := 0; i < 1000; i++ { go Write("aaa") go Read("aaa") go Write(&qu

  • golang执行命令操作 exec.Command

    我就废话不多说了,大家还是直接看代码吧~ cmd := exec.Command("cmd") in := bytes.NewBuffer(nil) cmd.Stdin = in//绑定输入 var out bytes.Buffer cmd.Stdout = &out //绑定输出 go func() { in.WriteString("node E:/design/test.js\n")//写入你的命令,可以有多行,"\n"表示回车 }

  • golang执行命令获取执行结果状态(推荐)

    这几天在用golang写一个工具,要执行外部命令工具,而且还要将外部命令工具输出的日志也要输出出来.网上找了一下,资料很多,关键是执行的结果成功或失败状态没找到好的方法获取到. 刚开始想的是看错误日志,如果有错误日志,那么就是执行失败.测试的时候发现这样不行,发现有些时候会用error输出日志,但不一定就是执行失败.后来想用日志中的关键字匹配,因为有些命令执行成功或失败都是有关键字输出的,测试发现也不太好. 最后没办法,看了一下Cmd.Wait()方法的实现,突然眼前一亮,找到方法了,有一个Cm

  • golang 执行命令行的实现

    一般情况下,在 golang 中执行一些命令如 git clone,则可以使用 exec.Command 函数 func RunCommand(path, name string, arg ...string) (msg string, err error) { cmd := exec.Command(name, arg...) cmd.Dir = path err = cmd.Run() log.Println(cmd.Args) if err != nil { log.Println("er

  • Shell脚本中实现切换用户并执行命令操作

    今天公司同事来找到我说要在服务器上用另外一个用户执行python脚本,但设置到crontab里却老是root用户来执行,为了省事我就想了一个偷懒的办法,就是用shell脚本切换到那个用户,然后去执行那个python脚本.好了,这篇文章我只演示怎么用shell脚本切换到其他用户执行命令. 系统:centos 5.x 脚本内容: cat test.sh 复制代码 代码如下: #!/bin/bash su - test <<EOF pwd; exit; EOF 执行结果图: 当然也可以用下面的命令来

  • 详解Go语言中用 os/exec 执行命令的五种方法

    完整系列教程详见:http://golang.iswbm.com 在 Golang 中用于执行命令的库是 os/exec,exec.Command 函数返回一个 Cmd 对象,根据不同的需求,可以将命令的执行分为三种情况 只执行命令,不获取结果 执行命令,并获取结果(不区分 stdout 和 stderr) 执行命令,并获取结果(区分 stdout 和 stderr) 第一种:只执行命令,不获取结果 直接调用 Cmd 对象的 Run 函数,返回的只有成功和失败,获取不到任何输出的结果. pack

  • 详解golang执行Linux shell命令完整场景下的使用方法

    目录 1. 执行命令并获得输出结果 2. 将stdout和stderr分别处理 3. 异步执行命令 4. 执行时带上环境变量 5. 预先检查命令是否存在 6. 两个命令依次执行,管道通信 7. 按行读取输出内容 8. 获得exit code 1. 执行命令并获得输出结果 CombinedOutput() 执行程序返回 standard output and standard error func main() { cmd := exec.Command("ls", "-lah

  • Golang执行cmd命令行的方法

    1. Golang执行系统命令使用 os/exec Command方法: func Command(name string, arg ...string) *Cmd 第一个参数是命令名称,后面参数可以有多个命令参数. cmd := exec.Command("ls", "-a") if stdout, err := cmd.StdoutPipe(); err != nil {     //获取输出对象,可以从该对象中读取输出结果     log.Fatal(err)

  • Golang通过SSH执行交换机操作实现

    简单实现通过输入指令,两步执行交换机命令. 输入执行换机的账号和密码.可以一次输入多个账号和密码,为了方便操作,规定了输入格式.如 用户名:主机IP;密码|用户名:主机IP;密码.举例admin;192.168.56.10;h3csw1|admin;192.168.56.11;h3csw2 输入要执行的命令,以;分割.例如system-view;dis cu; ​ 存在问题: 不够灵活.输入方式限制太死,输入特别字符也可能存在错误. 过于简陋. 功能简单. ​ 不过我的目的已经达到,我主要是了解

  • docker 在容器外执行某个容器内的某个命令操作

    有时候我们想执行某个容器的某条命令,但又不想进入容器内.那该怎么办? 于是脚本可以这样写 #!/bin/bash DOCKER_ID=62f3f40ab240 sudo docker exec -it $DOCKER_ID /bin/bash -c 'cd /packages/detectron && python tools/train.py' done 补充知识:解决docker容器与宿主机无缝调用shell命令问题 我就废话不多说了,大家看解决方法吧~ nsenter -t 1 -m

  • Centos7.3开机自动启动或执行指定命令操作

    在centos7中,/etc/rc.d/rc.local文件的权限被降低了,没有执行权限,需要给它添加可执行权限. chmod +x /etc/rc.d/rc.local 然后就可以在里面添加你要开机自启的命令了 vi /etc/rc.d/rc.local 补充知识:centOS7.2将自定义的脚本设置成service,并开机启动 spring boot的jar包部署上线时,希望能将其设置成service,并能开机启动,步骤如下: 1.准备好脚本(网上很多,此处不写了) 2.建立一个软连接到/e

随机推荐