Golang 中创建守护进程的正确姿势

一直对守护进程有点迷糊, Srs的守护进程是通过两次fork实现的。C/C++一般的做法是fork一次, 然后调用setsid() 实现daemon, golang呢?守护进程的特点守护进程: 我的理解是脱离控制台的进程。一般我们执行程序都是在shell/bash下启动程序, 如果不以守护进程方式启动,该程序的父进程一般就是bash或shell, 通过ps -ef | grep xxx...
摘要由CSDN通过智能技术生成

一直对守护进程有点迷糊, Srs的守护进程是通过两次fork实现的。
C/C++一般的做法是fork一次, 然后调用setsid() 实现daemon, golang呢?

守护进程的特点

守护进程: 我的理解是脱离控制台的进程。
一般我们执行程序都是在shell/bash下启动程序, 如果不以守护进程方式启动,该程序的父进程一般就是bash或shell, 通过ps -ef | grep xxx, 看第三列的内容, 可以看到当前进程的父进程。

golang中启动daemon其实很简单, 话不多说上代码:


func main() {
      // when os.Getppid() != 1, not in daemon
	   if os.Getppid() != 1 {
	   
		// create log file: when run in daemon success, but log file has not init, stdout/stderr will dup2 the log
		// 这里为什么这样做是因为: 如果我们daemon启动成功了, 父进程会返回, 子进程运行时脱离控制台, 当我们直接向控制台再次打印日志时, 会被定向到/dev/null, 所以如果有什么错误信息, 我们是看不到的。所以最好的做法时, 先创建一个文件, 将子进程输出到控制台的日志dup2 到该日志文件
	   		createLogFile := func (fileName string) (fd *os.File, err error) {
			dir := path.Dir(fileName)
			if _, err 
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值