命令记不住

登陆

调用 cmd 命令和写文件内容并获取系统时间

golang 调用cmd命令和写文件内容并获取系统时间

1.使用cmd命令

1.Golang 执行 shell 脚本,不接收返回值。Run(),命令其实是调用了 cmd.Start()和 cmd.Wait()两个方法,只返回一个 error 对象

// 返回一个 cmd 对象
cmd := exec.Command("sh", "-c", "./scripts/curl.sh")
 
// 如果只执行命令,不接收返回值
cmd.Run()

2.Golang 执行 shell脚本,接收返回值。返回值就是 shell 脚本打印的日志信息,但这样有一个缺点,golang 接收 shell 脚本的打印结果,必须要等待 shell 脚本全部执行完成才能一次性返回

// 返回一个 cmd 对象
cmd := exec.Command("sh", "-c", "./scripts/curl.sh")
 
// 收返回值[]byte, error
b,er:= cmd.Output()
 
log.Pringln(string(b))

3.Golang 执行 shell脚本,并实时打印 shell 脚本输出日志信息。

实际业务比如:异步任务调度系统、自动发布系统等都有可能需要 shell 脚本的配合来完成,就需要实时打印 shell 脚本的中每条命令的输出日志信息,便于查看任务进度等

func main(){
  execute()
}
func asyncLog(reader io.ReadCloser) error {
  cache := ""
  buf := make([]byte, 1024, 1024)
  for {
    num, err := reader.Read(buf)
    if err != nil {
      if err == io.EOF || strings.Contains(err.Error(), "closed") {
        err = nil
      }
      return err
    }
    if num > 0 {
      oByte := buf[:num]
      h.logInfo = append(h.logInfo, oByte...)
      oSlice := strings.Split(string(oByte), "\n")
      line := strings.Join(oSlice[:len(oSlice)-1], "\n")
      fmt.Printf("%s%s\n", cache, line)
      cache = oSlice[len(oSlice)-1]
    }
  }
  return nil
}
 
func execute() error {
  cmd := exec.Command("sh", "-c", "./scripts/curl.sh")
 
  stdout, _ := cmd.StdoutPipe()
  stderr, _ := cmd.StderrPipe()
 
  if err := cmd.Start(); err != nil {
    log.Printf("Error starting command: %s......", err.Error())
    return err
  }
 
  go asyncLog(stdout)
  go asyncLog(stderr)
 
  if err := cmd.Wait(); err != nil {
    log.Printf("Error waiting for command execution: %s......", err.Error())
    return err
  }
 
  return nil
}

2.获取系统时间

参看:https://wenku.baidu.com/view/b5a99a6d757f5acfa1c7aa00b52acfc789eb9fb2.html

cday := time.Now().Day()
chour := time.Now().Hour()
cminute := time.Now().Minute()

//转字符串
nowtime := strconv.Itoa(cday) + strconv.Itoa(chour) + strconv.Itoa(cminute)

转字符串参考:https://www.yisu.com/zixun/369762.html

3.创建文件并追加内容

第一种方式:

func main() {
  file, err := os.OpenFile("d:/test.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
  if err != nil {
    fmt.Println("获取文件句柄失败:", err)
    os.Exit(2)
  }
  defer file.Close()
  writer := bufio.NewWriter(file)
  str := "hello world!\n"
  for i := 0; i < 5; i++ {
    writer.WriteString(str)
  }
  writer.Flush()
}

4.实例监控系统cpu

第一版:

package main

import (
  "fmt"
  "os"
  "os/exec"
  "strconv"
  "time"
)

func main() {
  ticker := time.NewTicker(2 * time.Minute)
  defer ticker.Stop()
  for range ticker.C {
    cpumonitor()
  }
}

func cpumonitor() {
  cday := time.Now().Day()
  chour := time.Now().Hour()
  cminute := time.Now().Minute()

  nowtime := strconv.Itoa(cday) + strconv.Itoa(chour) + strconv.Itoa(cminute)

  cmdhead := exec.Command("/bin/bash", "-c", "top -n 1 -b  |  awk 'NR<7{print $0}'")
  cmdbody := exec.Command("/bin/bash", "-c", "top -n 1 -b  |  awk 'NR>7{print $0}' | sort |uniq | sort -k 9 -nr| head -5")

  bhead, er := cmdhead.Output()
  if er != nil {
    fmt.Println("bhead: ", er)
  }
  bbody, er := cmdbody.Output()
  if er != nil {
    fmt.Println("bbody: ", er)
  }
  f, err := os.Create("cpu_monitor-" + string(nowtime) + ".log")
  if err != nil {
    fmt.Println(err)
    return
  }
  defer f.Close()
  f.WriteString(string(bhead) + "\n")
  f.WriteString(string(bbody) + "\n")
}

1

推荐阅读