通用技术 go linxu 环境安装,webserver 开发及 go 语言如何调用 shell 脚本

虫兵 · 2017年11月01日 · 最后由 虫兵 回复于 2017年11月02日 · 1619 次阅读

话题编写背景

压测工具平台的特殊性需要监控底层服务是否 core 掉,所以在语言选择环境的搭建复杂度多方面思考选择了 go,因为她不需要运行环境,编译成 binary 库之后直接就可以在 Linux 通过 linxu 命令运行,不需要依赖库,非常方便,所以有了以下内容,不对的地方希望大家多多探讨

go 语言背景介绍

Go 语言是谷歌 2009 年发布的第二款开源编程语言。Go 语言专门针对多处理器系统应用程序的编程进行了优化,使用 Go 编译的程序可以媲美 C 或 C++ 代码的速度,而且更加安全、支持并行进程。北京时间2010年1月10日,Go 语言摘得了 TIOBE 公布的 2009 年年度大奖。Go 语言设计支持主流的 32 位和 64 位的 x86 平台,同时也支持 32 位的 ARM 架构。谷歌资深软件工程师罗布·派克 (Rob Pike) 表示,“Go 让我体验到了从未有过的开发效率。2013年5月07日,Go 语言 Go 1.1RC2 版发布。Vim 是从 vi 发展出来的一个文本编辑器,代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用(原文来自百度百科,详情自己搜索)
话不多说,直接进入正题吧

go linxu 环境安装

go 语言 linux 环境包下载(https://golang.org/dl/ go1.9.2.linux-amd64.tar.gz )
下载后选择你喜欢的位置解压,并且配置 go 语言的环境变量,为了你的环境变量有可能重启 shell 不生效 建议写在文件里(vim /root/.bashrc)
通过 go version 测试你的环境是否生效,一切 ok 后就可以开发一个 webserver
go webserver 开发及如何调用 shell
话不多说,直接上代码吧

package main  
import (  
    "encoding/json"  
    "fmt"  
    "net/http"  
    "log"
    "os"
    "os/exec" 
)  

type BaseJsonBean struct {  
    Code    int         `json:"Code"`  
    Message string      `json:"Message"`  
}  

func NewBaseJsonBean() *BaseJsonBean {  
    return &BaseJsonBean{}  
}


func checkErr(err error) {
    if err != nil {
        log.Println(err)
    }
}

func WebServerBase() {  
    var i,p = "xxxxxxx","xxxx"
    log.Println("api  [ getRelayRunStatus  ]monitor relay run staus is start... server is ",i+":"+p) 

    http.HandleFunc("/getRelayRunStatus", moitorRelay)  


    err := http.ListenAndServe("0.0.0.0:"+p, nil)  
    checkErr(err)  
}  

func moitorRelay(w http.ResponseWriter, req *http.Request) {  
    log.Println("moitorRelay is running...") 
    //req.ParseForm()
    result := NewBaseJsonBean()
    if req.Method == "GET"{
        result.Code = 2001
        result.Message = "warning: request method must be post"
        bytes, _ := json.Marshal(result)
        fmt.Fprint(w,string(bytes))
        return
    }else{
    ip := req.FormValue("ip")
    port  := req.FormValue("port")
    log.Println(ip,port)
    if ip == "" || port == "" {  
        result.Code = 2001 
        result.Message = "error:parameters is null "
        bytes, _ := json.Marshal(result) 
        fmt.Fprint(w, string(bytes))
        return
    }
    f, err := os.OpenFile("monitor_relay.sh", os.O_WRONLY|os.O_TRUNC, 0600)
    defer f.Close() 
    f.WriteString("netstat -nlpt | grep "+ip+" | grep "+port)
    if err != nil {fmt.Println(err.Error())}
    cmd, err := exec.Command("/bin/sh", "./monitor_relay.sh").Output()
    var str = string(cmd)
    if str == ""{
        result.Code = 2000
        result.Message = "success:relay is core"
        bytes, _ := json.Marshal(result)
        fmt.Fprint(w, string(bytes))
        return
    }else{
        result.Code = 2002
        result.Message = "success:relay not core "+str
        bytes, _ := json.Marshal(result)
        fmt.Fprint(w, string(bytes)) 
        return
        }
    }


}

func main(){
    WebServerBase()
}

这里我想强调的是,go 在处理 shell 脚本时并且传参到 shell 脚本时是通过每次重新覆盖 shell 脚本文件的方式,先生成 shell 文件在通过 go 来调用的

参考文献

http://www.yiibai.com/go/
https://studygolang.com/articles/4846

博主地址:http://blog.csdn.net/a11en_03(后续还会继续更新测试开发中遇到的感觉值得分享的东西)

共收到 5 条回复 时间 点赞

自顶一个

恒温 屏蔽了此话题:排版问题 11月01日 14:33

@Lihuazhang 已修改

恒温 回复

为啥 我应用 markdown 语法 不好使啊

@Lihuazhang 话题已修改

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册