golang调用shell命令(实时输出, 终止等)

您所在的位置:网站首页 golang代替python golang调用shell命令(实时输出, 终止等)

golang调用shell命令(实时输出, 终止等)

#golang调用shell命令(实时输出, 终止等)| 来源: 网络整理| 查看: 265

背景 是这样的,最近在研究一个定时任务系统的改造,可能有点像jenkins做到的那种吧。 可以输入shell命令,也可以执行py脚本等等,相比之前来说,也要能够及时停止! 但是遇到了这么个问题,golang执行py脚本的时候获取不到脚本的输出。 首先来看看go里面怎么运行shell脚本吧,我比较喜欢执行全部命令。 普通用法(一次性获取所有输出) package main import ( "fmt" "os/exec" ) func main() { Command("ls") } // 这里为了简化,我省去了stderr和其他信息 func Command(cmd string) error { c := exec.Command("bash", "-c", cmd) // 此处是windows版本 // c := exec.Command("cmd", "/C", cmd) output, err := c.CombinedOutput() fmt.Println(string(output)) return err }

可以看到,当前命令执行的是输出当前目录下的文件/文件夹

image.png

实时显示

效果图:

image.png

package main import ( "bufio" "fmt" "io" "os/exec" "sync" ) func main() { // 执行ping baidu的命令, 命令不会结束 Command("ping www.baidu.com") } func Command(cmd string) error { //c := exec.Command("cmd", "/C", cmd) // windows c := exec.Command("bash", "-c", cmd) // mac or linux stdout, err := c.StdoutPipe() if err != nil { return err } var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() reader := bufio.NewReader(stdout) for { readString, err := reader.ReadString('\n') if err != nil || err == io.EOF { return } fmt.Print(readString) } }() err = c.Start() wg.Wait() return err } 可关闭+实时输出 package main import ( "bufio" "context" "fmt" "io" "os/exec" "sync" "time" ) func main() { ctx, cancel := context.WithCancel(context.Background()) go func(cancelFunc context.CancelFunc) { time.Sleep(3 * time.Second) cancelFunc() }(cancel) Command(ctx, "ping www.baidu.com") } func Command(ctx context.Context, cmd string) error { // c := exec.CommandContext(ctx, "cmd", "/C", cmd) c := exec.CommandContext(ctx, "bash", "-c", cmd) // mac linux stdout, err := c.StdoutPipe() if err != nil { return err } var wg sync.WaitGroup wg.Add(1) go func(wg *sync.WaitGroup) { defer wg.Done() reader := bufio.NewReader(stdout) for { // 其实这段去掉程序也会正常运行,只是我们就不知道到底什么时候Command被停止了,而且如果我们需要实时给web端展示输出的话,这里可以作为依据 取消展示 select { // 检测到ctx.Done()之后停止读取 case


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3