一直对守护进程有点迷糊, 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