
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)
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