고로 간단한 문지기 프로그램 쓰기(WatchDog)

2649 단어
약술
회사의 일부 작은 프로그램은 임시로 사용하기 때문에 (업데이트를 유지하지 않기 때문에) 어떤 버그는 붕괴를 초래할 수 있지만, 심각하지는 않기 때문에 붕괴되면 다시 시작하면 된다.그래서 문지기 프로그램을 써서 프로그램을 감시하고 끊었다(프로그램의 다른 상태에 관심이 없기 때문에) 바로 다시 시작합니다.
참고: 소프트웨어 문지기 프로그램
코드
package main

import (
    "fmt"
    "log"
    "os"
    "os/exec"
    "os/signal"
    "path/filepath"
    "syscall"
)

func main() {
    argc := len(os.Args)
    if argc < 2 {
        fmt.Println("Usage:", os.Args[0], " pragram args...")
        return
    }
    workdir, err := os.Getwd()
    if err != nil {
        fmt.Println("    ", err.Error())
    }

    name := os.Args[1]
    args := os.Args[1:]
    {
        if filepath.Base(name) == name {
            if lp, err := exec.LookPath(name); err != nil {
                log.Println("        ", err.Error())
                return
            } else {
                name = lp
            }
        }
    }

    log.Println("      :", workdir)
    var cmdline string
    for _, arg := range args {
        cmdline += arg + " "
    }
    log.Println("    :", cmdline)
    var cmd *exec.Cmd
    //      chan
    c := make(chan os.Signal)
    //       ctrl+c kill
    signal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
    go func() {
        for s := range c {
            switch s {
            case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:
                log.Println("    ", s)
                err = cmd.Process.Kill()
                if err != nil {
                    log.Println("      :", err.Error())
                }
                os.Exit(0)
            }
        }
    }()

    for {
        cmd = &exec.Cmd{
            Path:   name,
            Args:   args,
            Dir:    workdir,
            Stdin:  os.Stdin,
            Stdout: os.Stdout,
            Stderr: os.Stderr,
        }
        // log.Println(cmd.Args)
        err = cmd.Run()
        if err != nil {
            log.Println("      :", err.Error())
            err = cmd.Process.Kill()
            if err != nil {
                log.Println("      :", err.Error())
            }
            log.Println("      ")
            continue
        }
        exitcode := cmd.ProcessState.ExitCode()
        if exitcode != 0 {
            log.Println("      :", exitcode)
            log.Println("      ")
            continue
        }
        break
    }
    log.Println("      ")
}

전재 대상:https://www.cnblogs.com/oloroso/p/11417804.html

좋은 웹페이지 즐겨찾기