caddy常用指令:
前台运行caddy:./caddy run
后台运行caddy:./caddy start
停止caddy:./caddy stop
重载配置:./caddy reload
我想实现类似caddy 的后台启动、停止、重载、停止等功能
不接着借助于第三方后台守护程序来实现。
请问如何实现?
前台运行caddy:./caddy run
后台运行caddy:./caddy start
停止caddy:./caddy stop
重载配置:./caddy reload
我想实现类似caddy 的后台启动、停止、重载、停止等功能
不接着借助于第三方后台守护程序来实现。
请问如何实现?
让应用启动后在后台运行,可以参考下面这段代码,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
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.4k 阅读
2 回答935 阅读✓ 已解决
2 回答2.3k 阅读
1 回答2.2k 阅读
在后台启动应该是启动了一个新的进程,然后在一个位置记录这个PID。
然后,再执行stop子命令的时候,读取程序PID,向这个PID发送停止信号,程序收到信号后,执行停止的操作。
重载和停止一样,只不过发送的是不同的信号,程序收到信号后处理过程不一样。
这个其实就是 进程通信 信号
golang 里面的 os/signal 包就是处理这个的
后台守护其实不只是控制程序的启动停止和重载,后台守护主要还是在检测程序是否在运行、然后在适当的时候自动重新启动程序。
使用caddy start启动的程序,作用只是启动一个新的进程,没有后续的检测和保活机制。所以这个和第三方后台守护程序不冲突,程序启动后一般还是要配一个后台守护的,和程序启动的方式没什么关系。