本篇内容介绍了“如何配置go根据端口号启动程序,并守护该进程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
成都创新互联公司公司2013年成立,先为滦南等服务建站,滦南等地企业,进行企业商务咨询服务。为滦南企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
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根据端口号启动程序,并守护该进程”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!