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.txt
lnk
    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
}

//程序运行效果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值