golang 如何后台运行,命令模式?

caddy常用指令:

前台运行caddy:./caddy run
后台运行caddy:./caddy start
停止caddy:./caddy stop
重载配置:./caddy reload

我想实现类似caddy 的后台启动、停止、重载、停止等功能

不接着借助于第三方后台守护程序来实现。

请问如何实现?

阅读 2.7k
2 个回答
✓ 已被采纳

在后台启动应该是启动了一个新的进程,然后在一个位置记录这个PID。

然后,再执行stop子命令的时候,读取程序PID,向这个PID发送停止信号,程序收到信号后,执行停止的操作。

重载和停止一样,只不过发送的是不同的信号,程序收到信号后处理过程不一样。

这个其实就是 进程通信 信号
golang 里面的 os/signal 包就是处理这个的


后台守护其实不只是控制程序的启动停止和重载,后台守护主要还是在检测程序是否在运行、然后在适当的时候自动重新启动程序。

使用caddy start启动的程序,作用只是启动一个新的进程,没有后续的检测和保活机制。所以这个和第三方后台守护程序不冲突,程序启动后一般还是要配一个后台守护的,和程序启动的方式没什么关系。

让应用启动后在后台运行,可以参考下面这段代码,6年前写的了,有点老了

    // 如果是守护进程模式,则创建子进程,退出父进程
    if daemonize && os.Getppid() != 1 {
        binary, err := exec.LookPath(os.Args[0])
        if err != nil {
            fmt.Println("failed to lookup binary:", err)
            os.Exit(2)
        }
        _, err = os.StartProcess(binary, os.Args, &os.ProcAttr{Dir: "", Env: nil, Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}, Sys: nil})
        if err != nil {
            fmt.Println("failed to start process:", err)
            os.Exit(2)
        }

        os.Exit(0)
    }

源码在这里 mylxsw/coyotes

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题