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
}
//程序运行效果