有时候,我们需要时时拿到shell的执行过程,希望能时时看到执行过程,或者是希望把执行过程写入到日志或者数据库,并通过其它方式时时查看执行过程

package main

import (
    "bufio"
    "fmt"
    "golang.org/x/text/encoding/simplifiedchinese"
    "io"
    "os"
    "os/exec"
)

type Charset string

const (
    UTF8    = Charset("UTF-8")
    GB18030 = Charset("GB18030")
)


func main(){
    //execCommand(os.Args[1], os.Args[2:])
    par:=[]string{
        "-c",
        "sh test.sh",
    }
    execCommand("/bin/sh", par)
}

//封装一个函数来执行命令
func execCommand(commandName string, params []string) bool {

    //执行命令
    cmd := exec.Command(commandName,params...)

    //显示运行的命令
    fmt.Println(cmd.Args)

    stdout, err := cmd.StdoutPipe()
    errReader,errr := cmd.StderrPipe()

    if errr != nil{
        fmt.Println("err:"+errr.Error())
    }

    //开启错误处理
    go handlerErr(errReader)

    if err != nil {
        fmt.Println(err)
        return false
    }

    f,err := os.Create("./test.log")
    defer f.Close()


    cmd.Start()
    in := bufio.NewScanner(stdout)
    for in.Scan() {
        cmdRe:=ConvertByte2String(in.Bytes(),"UTF8")
        fmt.Println("->",cmdRe)
        _,err=f.Write([]byte(cmdRe+"\n"))
    }


    cmd.Wait()
    return true
}

func check(e error) {
    if e != nil {
        panic(e)
    }
}

/**
 * 判断文件是否存在  存在返回 true 不存在返回false
 */
func checkFileIsExist(filename string) bool {
    var exist = true
    if _, err := os.Stat(filename); os.IsNotExist(err) {
        exist = false
    }
    return exist
}

//开启一个协程来输出错误
func handlerErr(errReader io.ReadCloser){
    in := bufio.NewScanner(errReader)
    for in.Scan() {
        cmdRe:=ConvertByte2String(in.Bytes(),"UTF8")
        fmt.Errorf(cmdRe)
    }
}

//对字符进行转码
func ConvertByte2String(byte []byte, charset Charset) string {
    var str string
    switch charset {
    case GB18030:
        var decodeBytes,_=simplifiedchinese.GB18030.NewDecoder().Bytes(byte)
        str= string(decodeBytes)
    case UTF8:
        fallthrough
    default:
        str = string(byte)
    }
    return str
}

shell脚本:

#!/bin/bash
for((i=0;i<10;i++))
do
    sleep 1
    echo $(date +"%Y-%m-%d %H:%M:%S")
done

执行结果:

[/bin/sh -c sh test.sh]
-> 2020-07-23 11:01:51
-> 2020-07-23 11:01:52
-> 2020-07-23 11:01:53
-> 2020-07-23 11:01:54
-> 2020-07-23 11:01:55
-> 2020-07-23 11:01:56
-> 2020-07-23 11:01:57
-> 2020-07-23 11:01:58
-> 2020-07-23 11:01:59
-> 2020-07-23 11:02:00

通过:golang 模拟tailf 来时时输出显示日志,请看下一篇