main.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/cron"
  5. "log"
  6. "net/http"
  7. "net/url"
  8. "os"
  9. "os/exec"
  10. qu "qfw/util"
  11. "runtime"
  12. "strconv"
  13. "strings"
  14. "time"
  15. )
  16. var (
  17. sysconfig map[string]interface{} //配置文件
  18. vpsID,during string //机器唯一标识
  19. processArr []string //机器相关下载器
  20. )
  21. func init() {
  22. qu.ReadConfig(&sysconfig)
  23. vpsID = qu.ObjToString(sysconfig["vpsID"])
  24. during = qu.ObjToString(sysconfig["during"])
  25. processArr = qu.ObjArrToStringArr(sysconfig["processArr"].([]interface{}))
  26. }
  27. func main() {
  28. if vpsID == "" || len(processArr) < 1 {
  29. log.Println("配置文件异常,请检查......")
  30. os.Exit(1)
  31. }
  32. //定时器
  33. c := cron.New()
  34. spec := fmt.Sprintf("0 */%s * * * ?",during) //分
  35. //spec =fmt.Sprintf("*/%s * * * * ?",during) //秒
  36. c.AddFunc(spec, func() { task() })
  37. c.Start()
  38. time.Sleep(99999 * time.Hour)
  39. }
  40. func task() {
  41. log.Println("执行...检测...")
  42. //先检测下载器
  43. process := "0" //正常 - windows模式
  44. for _,v:=range processArr {
  45. if runtime.GOOS == "windows" {
  46. b,_,_ := isProcessExist(v)
  47. if !b {
  48. process = "1"
  49. break
  50. }
  51. }else { //linux测试使用
  52. b,_:=checkProRunning(v)
  53. if !b {
  54. process = "1"
  55. break
  56. }
  57. }
  58. }
  59. //log.Println("当前下载器:",process)
  60. //u, _ := url.Parse("http://127.0.0.1:7811") //本地测试
  61. u, _ := url.Parse("http://monitor.spdata.jianyu360.com") //线上
  62. q := u.Query()
  63. q.Set("id", vpsID)
  64. q.Set("process", process)
  65. u.RawQuery = q.Encode()
  66. //log.Println(vpsID,process)
  67. _, err := http.Get(u.String());
  68. if err != nil {
  69. log.Println("异常",err)
  70. }
  71. }
  72. /****************分割线******************/
  73. /****************分割线******************/
  74. /****************分割线******************/
  75. //根据进程名判断进程是否运行
  76. func checkProRunning(serverName string) (bool, error) {
  77. cmd := `ps ux | awk '/` + serverName + `/ && !/awk/ {print $2}'`
  78. pid, err := runInLinux(cmd)
  79. if err != nil {
  80. return false, err
  81. }
  82. return pid != "", nil
  83. }
  84. //根据进程名称获取进程ID
  85. func getPid(serverName string) (string, error) {
  86. cmd := `ps ux | awk '/` + serverName + `/ && !/awk/ {print $2}'`
  87. pid, err := runInLinux(cmd)
  88. return pid , err
  89. }
  90. //
  91. func runInLinux(cmd string) (string, error) {
  92. result, err := exec.Command("/bin/sh", "-c", cmd).Output()
  93. if err != nil {
  94. return "", err
  95. }
  96. return strings.TrimSpace(string(result)), err
  97. }
  98. func isProcessExist(appName string) (bool, string, int) {
  99. appary := make(map[string]int)
  100. cmd := exec.Command("cmd", "/C", "tasklist")
  101. output, _ := cmd.Output()
  102. //fmt.Printf("fields: %v\n", output)
  103. n := strings.Index(string(output), "System")
  104. if n == -1 {
  105. //log.Println("no find")
  106. //os.Exit(1)
  107. }
  108. data := string(output)[n:]
  109. fields := strings.Fields(data)
  110. for k, v := range fields {
  111. if v == appName {
  112. appary[appName], _ = strconv.Atoi(fields[k+1])
  113. return true, appName, appary[appName]
  114. }
  115. }
  116. return false, appName, -1
  117. }