Gomander 是一个基于 Cobra 的 Go 进程守护化库,让你的程序轻松支持前台运行和后台 daemon 模式,并提供完整的进程生命周期管理。
start、stop、restart、reload、status 子命令-d 参数将进程后台运行go get github.com/muleiwu/gomander
package main
import (
"fmt"
"time"
"github.com/muleiwu/gomander"
)
func main() {
gomander.Run(func() {
fmt.Println("应用程序启动...")
for {
time.Sleep(5 * time.Second)
fmt.Println("运行中...")
}
})
}
func main() {
gomander.Run(func() {
// 你的业务逻辑
},
gomander.WithPidFile("./myapp.pid"),
gomander.WithLogFile("./myapp.log"),
)
}
编译你的程序后,即可使用以下子命令:
go build -o myapp
# 前台运行(日志输出到终端)
./myapp start
# 后台守护进程运行
./myapp start -d
# 或
./myapp start --daemon
守护模式下:
./gomander.log)./gomander.pid)./myapp stop
读取 PID 文件并发送 SIGTERM 信号,优雅停止守护进程。
./myapp restart
停止当前运行的进程,然后以守护模式重新启动。
./myapp reload
向守护进程发送 SIGHUP 信号,可用于触发配置重载(需要在业务代码中实现重载逻辑)。
./myapp status
显示守护进程的当前状态,包括:
| 选项 | 说明 | 默认值 |
|---|---|---|
WithPidFile(path) | PID 文件路径 | ./gomander.pid |
WithLogFile(path) | 日志文件路径 | ./gomander.log |
myapp start → 直接执行用户函数 → 日志输出到终端
myapp start -d → Fork 子进程 → 父进程退出 ↓ 子进程(守护进程) ↓ 创建新会话(setsid) ↓ 写入 PID 文件 ↓ 重定向输出到日志文件 ↓ 执行用户函数
| 信号 | 行为 |
|---|---|
| SIGTERM | 优雅退出,清理 PID 文件 |
| SIGINT | 优雅退出,清理 PID 文件 |
| SIGHUP | 触发重载(不退出进程) |
查看 example/main.go 获取完整示例。
cd example
go build -o myapp
# 启动守护进程
./myapp start -d
# 查看状态
./myapp status
# 查看日志
tail -f myapp.log
# 重载配置
./myapp reload
# 重启进程
./myapp restart
# 停止进程
./myapp stop
| 变量 | 说明 |
|---|---|
GOMANDER_DAEMON=1 | 内部使用,标识当前进程是守护进程子进程 |
restart 命令会等待原进程退出(最多 10 秒)后再启动新进程MIT