天天看點

Go服務添加守護程序及kill守護程序

Go服務添加守護程序及kill守護程序

文章目錄

  • ​​Go服務添加守護程序及kill守護程序​​
  • ​​1. 前言​​
  • ​​2. Go添加守護程序​​
  • ​​3. 殺掉守護程序​​
  • ​​4. 檢視程序​​

1. 前言

最早開發服務功能時是将服務直接強制背景運作,然後添加shell腳本進行定時監控,最後發現可以添加守護程序和以及更強大的程序管理架構比如perp:是以在開發Go服務後我們也需要添加守護程序或者通過程序管理架構進行程序管理,這裡先介紹如何添加守護程序以及kill守護程序,等後面接觸到一些架構後再介紹架構,架構對程序的管理應該也是基于這些基礎的。

2. Go添加守護程序

守護程序簡單了解就是一種特殊的運作于背景的程序,不同于普通的背景運作程序,一個守護程序的父程序是init程序,因為它真正的父程序在fork出子程序後就先于子程序exit退出了,是以它是一個由init繼承的孤兒程序。也是以可以開機啟動,異常退出後會被重新拉起。

代碼:

package main

import (
    "fmt"
    "os"
    "os/signal"
    "path"
    "syscall"
)

func main() {
    if os.Getppid() != 1 {
        createLogFile := func(fileName string) (fd *os.File, err error) {
            dir := path.Dir(fileName)
            if _, err = os.Stat(dir); err != nil && os.IsNotExist(err) {
                if err = os.MkdirAll(dir, 0755); err != nil {
                    log.Error("Start-Daemon: create dir: %s failed, err is: %v", dir, err)
                    return
                }
            }

            if fd, err = os.Create(fileName); err != nil {
                log.Error("Start-Daemon: create log file: %s failed, err is: %v", fileName, err)
                return
            }

            return
        }

        logFd, err := createLogFile("./tsl_ser.log")
        if err != nil {
            return
        }
        defer logFd.Close()

        // start Daemon
        cmdName := os.Args[0]
        newProc, err := os.StartProcess(cmdName, os.Args, &os.ProcAttr{Files: []*os.File{logFd, logFd, logFd}})
        if err != nil {
            log.Error("Start-Deamon: start process: %s failed, err is: %v", cmdName, err)
            return
        }

        log.Info("Start-Deamon: run in daemon success, pid: %v", newProc.Pid)
        return
    }

    //todo:
    WSDiscovery()
    DevConfigService()

    select {}
}      

3. 殺掉守護程序

通過ps查找程序pid,然後使用

kill      

殺掉守護程序。

4. 檢視程序

這個簡單記錄一下,可以通過

man ps      

檢視一下ps指令,我們可以看到簡單的檢視所有的程序資訊的指令:

ps      
ps -e | grep