Go服务添加守护进程及kill守护进程


文章目录

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

然后我们通过grep名字来过滤:

ps -e | grep

其中的xxx就是进程名字。