IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]go 运维,检测 web 服务状态

    qcpm1983发表于 2015-01-08 10:45:00
    love 0

    延续前面的代码,在运维的时候经常需要检测 web 服务的状态,可以在 web 中专门设置一个测试页面(可以查询下数据库,返回一个指定的值)

    package main
    
    //使用的包
    import (
        "flag"
        "fmt"
        "io/ioutil"
        "log"
        "net"
        "net/http"
        "regexp"
    )
    
    //定义脚本的版本
    const VERSION = "0.1.0"
    
    //使用 flag 来定义命令输入的参数
    var Input_protocol = flag.String("p", "tcp", "The protocol you want to check")
    
    //定义检测 tcp 服务的脚本,用到 net 包
    func tcp(url string) int {
        _, err := net.Dial("tcp", url)
        if err != nil {
            fmt.Println(err)
            return 0
        } else {
            return 1
        }
    }
    
    //定义检测 udp 服务的脚本,用到 net 包
    func udp(url string) int {
        _, err := net.Dial("udp", url)
        if err != nil {
            fmt.Println(err)
            return 0
        } else {
            return 1
        }
    }
    
    //定义检测 http 服务的脚本,成功返回1,失败返回0
    func chttp(url, checkword string) int {
        res, err := http.Get(url)
        if err != nil {
            //如果连接失败返回错误
            log.Fatal(err)
            return 0
        }
    
        //使用 ioutil 读取得到的响应
        robots, err := ioutil.ReadAll(res.Body)
        //关闭资源
        res.Body.Close()
    
        //失败返回原因
        if err != nil {
            log.Fatal(err)
            return 0
        }
    
        //调用 regexp 函数查找 checkword
        word, err := regexp.MatchString(checkword, string(robots))
        if err != nil {
            log.Println(err)
            return 0
        }
        if word {
            log.Printf("The `%s`  find in `%s`", checkword, url)
            return 1
        }
        log.Printf("The `%s`  not find in `%s`", checkword, url)
        return 0
    }
    
    func main() {
        flag.Parse()
        if flag.NArg() < 1 {
            useage := "使用示例: check -p tcp 192.168.7.26:22 或者 check -p udp 192.168.7.23:123 或者 check -p http http://dockerpool.com  dockerpool"
            fmt.Println(useage)
            return
        }
        p := *Input_protocol
        switch {
        case p == "tcp":
            r := tcp(flag.Args()[0])
            fmt.Println(r)
        case p == "udp":
            r := udp(flag.Args()[0])
            fmt.Println(r)
        case p == "http":
            chttp(flag.Args()[0], flag.Args()[1])
        }
    }
    

    使用示例:

    $ check -p http http://dockerpool.com  dockerpool
    2015/01/08 10:38:53 The `dockerpool`  find in `http://dockerpool.com`
    $ check -p tcp www.sina.com:80
    1
    $ check -p tcp www.sina.com:88
    dial tcp 61.172.201.20:88: connection refused
    0


沪ICP备19023445号-2号
友情链接