123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- package main
- import (
- "fmt"
- "github.com/cron"
- "log"
- "net/http"
- "net/url"
- "os"
- "os/exec"
- qu "qfw/util"
- "runtime"
- "strconv"
- "strings"
- "time"
- )
- var (
- sysconfig map[string]interface{} //配置文件
- vpsID,during string //机器唯一标识
- processArr []string //机器相关下载器
- )
- func init() {
- qu.ReadConfig(&sysconfig)
- vpsID = qu.ObjToString(sysconfig["vpsID"])
- during = qu.ObjToString(sysconfig["during"])
- processArr = qu.ObjArrToStringArr(sysconfig["processArr"].([]interface{}))
- }
- func main() {
- if vpsID == "" || len(processArr) < 1 {
- log.Println("配置文件异常,请检查......")
- os.Exit(1)
- }
- //定时器
- c := cron.New()
- spec := fmt.Sprintf("0 */%s * * * ?",during) //分
- //spec =fmt.Sprintf("*/%s * * * * ?",during) //秒
- c.AddFunc(spec, func() { task() })
- c.Start()
- time.Sleep(99999 * time.Hour)
- }
- func task() {
- log.Println("执行...检测...")
- //先检测下载器
- process := "0" //正常 - windows模式
- for _,v:=range processArr {
- if runtime.GOOS == "windows" {
- b,_,_ := isProcessExist(v)
- if !b {
- process = "1"
- break
- }
- }else { //linux测试使用
- b,_:=checkProRunning(v)
- if !b {
- process = "1"
- break
- }
- }
- }
- //log.Println("当前下载器:",process)
- //u, _ := url.Parse("http://127.0.0.1:7811") //本地测试
- u, _ := url.Parse("http://monitor.spdata.jianyu360.com") //线上
- q := u.Query()
- q.Set("id", vpsID)
- q.Set("process", process)
- u.RawQuery = q.Encode()
- //log.Println(vpsID,process)
- _, err := http.Get(u.String());
- if err != nil {
- log.Println("异常",err)
- }
- }
- /****************分割线******************/
- /****************分割线******************/
- /****************分割线******************/
- //根据进程名判断进程是否运行
- func checkProRunning(serverName string) (bool, error) {
- cmd := `ps ux | awk '/` + serverName + `/ && !/awk/ {print $2}'`
- pid, err := runInLinux(cmd)
- if err != nil {
- return false, err
- }
- return pid != "", nil
- }
- //根据进程名称获取进程ID
- func getPid(serverName string) (string, error) {
- cmd := `ps ux | awk '/` + serverName + `/ && !/awk/ {print $2}'`
- pid, err := runInLinux(cmd)
- return pid , err
- }
- //
- func runInLinux(cmd string) (string, error) {
- result, err := exec.Command("/bin/sh", "-c", cmd).Output()
- if err != nil {
- return "", err
- }
- return strings.TrimSpace(string(result)), err
- }
- func isProcessExist(appName string) (bool, string, int) {
- appary := make(map[string]int)
- cmd := exec.Command("cmd", "/C", "tasklist")
- output, _ := cmd.Output()
- //fmt.Printf("fields: %v\n", output)
- n := strings.Index(string(output), "System")
- if n == -1 {
- //log.Println("no find")
- //os.Exit(1)
- }
- data := string(output)[n:]
- fields := strings.Fields(data)
- for k, v := range fields {
- if v == appName {
- appary[appName], _ = strconv.Atoi(fields[k+1])
- return true, appName, appary[appName]
- }
- }
- return false, appName, -1
- }
|