本篇内容介绍了“如何配置go根据端口号启动程序,并守护该进程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
func main() { fmt.Println("--------开始每十秒检测进程是否启动-------")
c := cron.New() c.AddFunc("@every 10s", portMonitoring)
c.Start() select {}
}func portMonitoring(){
config := commom.InitConfig("./config/test1.txt")
pidname := config["portOrPid"]
arr:=strings.Split(pidname,",")
portname := config["portAndName"]
portnameArr:=strings.Split(portname,",") for i,item := range arr{
port, _ :=strconv.Atoi(item) if portInUse(port) == -1 { println("程序监测到程序未启动,5秒后开始启动应用程序") fmt.Println("程序启动中...") time.Sleep(time.Duration(5)*time.Second) autoStart(portnameArr[i])
}else { fmt.Print("进程运行中!-------端口号:",port,"运行信息:(cpu 内存 名称 创建时间)****") fmt.Println(getPidInfo(int32(portInUse(port))))
}
}
}func portInUse(portNumber int) int {
res := -1 var outBytes bytes.Buffer cmdStr := fmt.Sprintf("netstat -ano -p tcp | findstr %d", portNumber)
cmd := exec.Command("cmd", "/c", cmdStr)
cmd.Stdout = &outBytes
cmd.Run()
resStr := outBytes.String()
r := regexp.MustCompile(`\s\d+\s`).FindAllString(resStr, -1) if len(r) > 0 {
pid, err := strconv.Atoi(strings.TrimSpace(r[0])) if err != nil {
res = -1 } else {
res = pid
}
} return res
}func getPidInfo(pid int32) (float64, float32, string, int64) { var rootProcess *process.Process processes, _ := process.Processes() for _, p := range processes { if p.Pid == pid {
rootProcess = p break }
}
info,_ :=rootProcess.CPUPercent()//cpu info2,_ :=rootProcess.MemoryPercent()//内存 info3,_ :=rootProcess.Name()//名称 info4,_ :=rootProcess.CreateTime()//名称 return info,info2,info3,info4
}func autoStart(name string) {
cmd := exec.Command("cmd.exe", "/c", "start lnk/" + name)
err := cmd.Run() if err != nil { fmt.Printf("error:%v \n", err)
}else { fmt.Printf("%s \n", name)
}
}
//文件目录
config
test1.txtlnk
startup
//配置文件
//应用程序端口号
portOrPid=8989
//应用程序对应得快捷方式
portAndName=startup.lnk
//多应用程序监听,直接逗号分割
//监测tomcat,redis portOrPid=8989,6379 portAndName=startup.lnk,redis-server.lnk
//配置文件读取
//读取key=value类型的配置文件func InitConfig(path string) map[string]string {
config := make(map[string]string)
f, err := os.Open(path) defer f.Close() if err != nil { panic(err)
}
r := bufio.NewReader(f) for {
b, _, err := r.ReadLine() if err != nil { if err == io.EOF {break } panic(err)
}
s := strings.TrimSpace(string(b))
index := strings.Index(s, "=") if index < 0 { continue }
key := strings.TrimSpace(s[:index]) if len(key) == 0 { continue }
value := strings.TrimSpace(s[index+1:]) if len(value) == 0 { continue }
config[key] = value
} return config
}
//程序运行效果
“如何配置go根据端口号启动程序,并守护该进程”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/3621859/blog/5048242