有时候,我们需要时时拿到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 来时时输出显示日志,请看下一篇