1 golang进程启动及监控

文章目录

  • 1 golang进程启动及监控
    • 1.1 以集成到业务代码的方式实现
    • 1.2 以单独代码的方式实现

以前用c++写过进程守护程序,可启动任意进程并监控进程,如果进程退出就自动重启,这里涉及到两个功能:

  • 守护进程(deamon):为任意进程创建守护进程,使进程脱离终端运行
  • 监控进程(forever):创建监控重启进程,使进程被杀死后能够重启

由于近期项目需要,使用go预研开发边缘智能程序,因此就想着通过golang实现进程守护及进程监控的功能,在golang程序中启动子进程,有很好的封装exec.Command,导入包为os/exec,本文主要以此种方式实现,包含以下两种实现方式。

1.1 以集成到业务代码的方式实现

此方式是把相关代码集成到我们需要监控的进程代码中,通过命令行参数来判断是否启用守护进程,其代码如下所示:
test.go

package testimport ("flag""fmt""os""os/exec""time"
)
func main() {daemon := flag.Bool("deamon", false, "run in daemon and forever")flag.Parse()//判断是否以守护进程的方式启动if *daemon {runbydeamon(os.Args) //执行deamon,由其启动主程序}//业务主程序代码fmt.Println("start test Service")
}//以deamon的方式启动程序,并监控进程
func runbydeamon(args []string) {fmt.Printf("PID: %d PPID: %d ARG: %s\n", os.Getpid(), os.Getppid(), os.Args)//去掉-deamon运行参数,启动主程序for i := 0; i < len(args); {if args[i] == "-deamon" && i != len(args)-1 {args = append(args[:i], args[i+1:]...)} else if args[i] == "-deamon" && i == len(args)-1 {args = args[:i]} else {i++}}//启动子进程,去掉-deamon参数后,执行程序,由于子程序无deamon参数,因此会直接执行业务代码for {cmd := exec.Command(args[0], args[1:]...)cmd.Stdin = os.Stdincmd.Stdout = os.Stdoutcmd.Stderr = os.Stderrerr := cmd.Start()//开启子进程if err != nil {fmt.Fprintf(os.Stderr, "start oasis erir [-] Error: %s\n", err)return}fmt.Println("run oasis bydeamon,pid=", cmd.Process.Pid, ",ppid=", os.Getpid(), "args=", args, "time=", time.Now())cmd.Wait() //阻塞等待进程退出}
}

通过go buid编写以后,执行"test -deamon"后,由于带有代码会启动两个test进程,第一次启动时由于带有参数"-deamon",因此会调用runbydeamon,此函数会去掉-deamon参数,再次以子进程的方式执行"test",通过cmd.start()启动子进程,子进程由于不带"-deamon",会直接进入业务代码实现,这里会打印:
start test Service,守护进程有一个for循环,一直在等待子进程退出,如果子进程异常退出,守护进程会再次把子进程进程拉起来并等待。

1.2 以单独代码的方式实现

上文实现方式,与业务代码耦合,启动时只需要带有一个参数即可启动守护进程和业务进程,启动比较简单,但是代码与业务耦合在一起,这种写法使得没法复用守护进程,其实守护进程与业务进程没有任何关系,大可提取出来,作为通用的守护进程程序,支持任务进程的后台启动和监控,代码如下:
deamon.go

package deamonimport ("flag""fmt""os""os/exec""time"
)
func main() {pcmd := flag.String("cmd", "", "run cmd in daemon and forever")flag.Parse()runbydeamon(*pcmd) //执行deamon,由其启动主程序
}//以deamon的方式启动程序,并监控进程
func runbydeamon(args string) {fmt.Printf("PID: %d PPID: %d ARG: %s\n", os.Getpid(), os.Getppid(), os.Args)if cmd==""{fmt.Println("cmd is null")os.Exit(0)}//启动子进程,既是去掉-deamon参数后,执行程序,由于子程序无deamon参数,因此会直接执行业务代码for {cmd := exec.Command(args[1], args[2:]...)cmd.Stdin = os.Stdincmd.Stdout = os.Stdoutcmd.Stderr = os.Stderrerr := cmd.Start()//开启子进程if err != nil {fmt.Fprintf(os.Stderr, "start oasis erir [-] Error: %s\n", err)return}fmt.Println("run oasis bydeamon,pid=", cmd.Process.Pid, ",ppid=", os.Getpid(), "args=", args, "time=", time.Now())cmd.Wait() //阻塞等待进程退出}
}

test.go

package test
import ("flag""fmt"
)
func main() {fmt.Println("start test Service")
}

以守护进程的方式启动进程命令:
deamon -cmd “test”

如果执行test要带命令行,可直接作为deamon的命令行传递给test:
deamon -cmd “test” -c “config.yaml”

有关运行参数flag定义,可根据需要自行定义,这里仅是一个例子

golang进程启动及监控相关推荐

  1. linux 监控进程调度,linux进程启动调度监控和管理

    linux进程启动调度监控和管理 (4页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 4.90 积分 实验一:Linux进程管理姓名韩师燕学号201109 ...

  2. linux 进程创建 进程启动 监控

    0x00 简介 在入侵检测的过程中,进程创建监控是必不可少的一点,因为攻击者的绝大多数攻击行为都是以进程的方式呈现,所以及时获取到新进程创建的信息能帮助我们快速地定位攻击行为. 本文将介绍一些常见的监 ...

  3. 使用 shell 脚本对 Linux 系统和进程资源进行监控

    Shell 简介 Shell 语言对于接触 LINUX 的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行.实际上 Shell 是 ...

  4. Linux 进程管理与监控(supervisor and monit)

    一.Supervisor 1.安装 宿主机环境:( Centos 6.5 ) pip2.7 install supervisor 2.创建配置文件 通过 echo_supervisord_conf 命 ...

  5. EasyCVR通过进程启动无报错,但是自动退出该如何解决?

    EasyCVR支持海量视频汇聚管理,可提供视频监控直播.云端录像.云存储.录像检索与回看.智能告警.平台级联.智能分析等视频服务.平台支持设备通过国标GB28181.RTMP.RTSP/Onvif.海 ...

  6. Chromium的GPU进程启动过程分析

    Chromium除了有Browser进程和Render进程,还有GPU进程.GPU进程负责Chromium的GPU操作,例如Render进程通过GPU进程离屏渲染网页,Browser进程也是通过GPU ...

  7. zabix监控linux进程名称,Zabbix监控Windows进程重启

    前段时间,一个朋友咨询我怎么监控Windows进程的重启.生产环境有监控进程的启动和关闭,但重启还没想过.经过一番思考和摸索后成功完成了监控,下面把监控思路和方法分享给大家. 我首先想到的是通过Zab ...

  8. golang程序启动流程详解

    golang程序启动流程详解 环境 go1.16.5 linux/amd64 用例 package mainimport "fmt"func main() {fmt.Println ...

  9. Linux 环境-TiDB组件进程维度的监控实现

    作者: sustyle 原文来源: https://tidb.net/blog/ab175b65 [toc] 一.背景介绍 TiDB运维工作中可能会遇到这么一个痛点,组件太多,机器永远不够.线上机器基 ...

最新文章

  1. python列表按值排序_json的python排序列表(按值)
  2. python 3读取文件-Python3 yaml文件读写操作
  3. CodeLobster PHP Edition v4.5.3 Professional 注册码
  4. Oracle12c与Oracle11g采用触发器与存储过程实现同步更新(代码+图解)
  5. TCP/IP / SYN 攻击以及解决办法
  6. 题解 AT5258 【[ABC156A] Beginner】
  7. Bootstrap3 轮番插件的使用方法
  8. 如何把域名解析到网站空间IP上?
  9. matlab中符号对象的数据类型是,符号对象(Symbolic Object)的使用
  10. 在C#中将集合用作键
  11. Hadoop为什么没有采用RAID?
  12. 开关造成的毛刺_解决交易中的毛刺问题,你可以这样做
  13. 微信群聊在哪个服务器,微信怎么找附近的群聊?微信群不见了怎么找?
  14. 计算机组成原理mips汇编大作业报告(冒泡排序、选择排序)
  15. python3.6library 学习 1.introduction,2.built-infunction
  16. 对keep-alive的理解,它是如何实现的,具体缓存的是什么?
  17. ffmpeg 实现音频aac编码
  18. 【转】本人常用资源整理(ing...)
  19. 我用Java模拟炒股及分析打板晋级胜率
  20. 威马汽车任命前高盛高管为首席战略官 新一轮融资将超30亿

热门文章

  1. 计算方法:列主元消去法,LU分解法, 雅可比迭代法,高斯塞德尔迭代法 解线性方程(C++)
  2. puppy linux 5.11中文集成清爽160m,中文Puppy Linux开发者之家
  3. 新能源造车的恒大创新样本
  4. 发烧友自制迷你单片编程器
  5. Java实现 LeetCode 754 到达终点数字(暴力+反向)
  6. 自动化测试难题,验证码如何解决
  7. 计算机保密检查发现反取证信息,计算机系统信息隐藏反取证技术①.PDF
  8. R语言产生对角阵、次对角阵等矩阵及矩阵运算
  9. 金仓数据库KingbaseES GIN 索引
  10. arcgis图斑尖角检查_ArcGIS消除零碎图斑(Eliminate)