golang调用命令的一次实践

package main

import (
	"bytes"
	"database/sql"
	"flag"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"os/exec"
	"errors"
	"strings"
	"time"
)

var interval int64

func init() {
	flag.Int64Var(&interval, "interval", 900, "检查更新间隔")
	flag.Parse()
	fmt.Println("检查更新间隔为", interval, "秒")
}


func SetCommandStd(cmd *exec.Cmd) (stdout, stderr *bytes.Buffer) {
	stdout = &bytes.Buffer{}
	stderr = &bytes.Buffer{}
	cmd.Stdout = stdout
	cmd.Stderr = stderr
	return
}

func CoordIP() {
	//cmd := exec.Command("ip a  |grep -E '10.8.0.'|awk '{print $2}'")
	db, err := sql.Open("mysql", "user:password@tcp(ip:port)/database?charset=utf8&parseTime=true")
	if err != nil {
		log.Fatalln("无法连接到mysql", err)
	}
	defer db.Close()
	var status string
	err = db.QueryRow("select status from monitor where app_code=?", "api").Scan(&status)
	if err != nil {
		log.Fatalln("执行查询语句出错", err)
	}
	fmt.Println("from mysql", status)

	psCmd := exec.Command("ip", "a")
	psStdout, psStderr := SetCommandStd(psCmd)
	err = psCmd.Run()
	if err != nil {
		err = errors.New(err.Error() + psStderr.String())
		log.Println("ip命令出错", err)
		return
	}
	// 筛选
	grepCmd := exec.Command("grep", "-E", "10.8.0.")
	grepCmd.Stdin = psStdout
	grepStdout, grepStderr := SetCommandStd(grepCmd)
	err = grepCmd.Run()
	if err != nil {
		err = errors.New(err.Error() + grepStderr.String())
		log.Println("grep命令出错", err)
		return
	}
	// awk
	awkCmd := exec.Command("awk", "{print $2}")
	awkCmd.Stdin = grepStdout
	awkStdout, awkStderr := SetCommandStd(awkCmd)
	err = awkCmd.Run()
	if err != nil {
		err = errors.New(err.Error() + awkStderr.String())
		log.Println("awk命令出错", err)
		return
	}
	fmt.Println("from command", awkStdout.String())
	localIP := awkStdout.String()
	if localIP != status {
		log.Println("不一致,将更新")
		ret, err := db.Exec("update monitor set status=? where app_code=?", localIP, "api")
		if err != nil {
			log.Println("更新失败", err)
		}else{
			_, err = ret.RowsAffected()
			if err != nil {
				log.Println("无任何影响", err)
			}else{
				fmt.Println("完成更新")
			}
		}
	}else{
		log.Println("mysql和本地一致")
	}
	fmt.Println(strings.Repeat("#", 60))
}


func main() {
	t := time.Tick(time.Second * time.Duration(interval))
	CoordIP()
	for {
		<- t
		CoordIP()
		fmt.Println("检查更新间隔为", interval, "秒")
	}
}

  

posted on 2021-07-26 13:42  Tarantino  阅读(81)  评论(0)    收藏  举报

导航