package main
import (
"bufio"
"context"
"fmt"
"io"
"os/exec"
"strings"
"sync"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
Command(ctx,cancel, "tail -f -n 0 test.log")
}
func Command(ctx context.Context, cancelFunc context.CancelFunc,cmd string) error {
c := exec.CommandContext(ctx, "bash", "-c", cmd) // mac linux
stdout, err := c.StdoutPipe()
if err != nil {
return err
}
var wg sync.WaitGroup
var readString string
wg.Add(1)
go func(wg *sync.WaitGroup) {
defer wg.Done()
reader := bufio.NewReader(stdout)
for {
readString, err = reader.ReadString('\n')
if err != nil || err == io.EOF {
return
}
if strings.Contains(readString, "aaa") {
fmt.Print(readString)
cancelFunc()
}
}
}(&wg)
err = c.Start()
wg.Wait()
return err
}
Go语言学习日记【二十七】golang调用shell持续输出命令,实时输出并在特定条件下终止
于 2022-03-29 15:43:52 首次发布