温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何配置go根据端口号启动程序,并守护该进程

发布时间:2021-10-11 09:55:14 来源:亿速云 阅读:341 作者:iii 栏目:编程语言

本篇内容介绍了“如何配置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根据端口号启动程序,并守护该进程

如何配置go根据端口号启动程序,并守护该进程

“如何配置go根据端口号启动程序,并守护该进程”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

go
AI