go-daemon
用于在 Go 中编写系统守护进程的库。
现在只支持基于 UNIX 的操作系统(不支持 Windows)。但是这个库只在 Linux 和 OSX 上进行了测试,所以如果你有能力在其他平台上测试这个库,请给我反馈(#26)。
请随时给我发送错误报告和修复。非常感谢所有的贡献者。
特性
- Goroutine 安全守护进程。
- 开箱即用的 pid 文件。
- 轻松处理系统信号。
- 守护进程的控制。
安装
go get github.com/sevlyar/go-daemon
您也可以使用 gopkg.in:
go get gopkg.in/sevlyar/go-daemon.v0
如果你想在生产项目中使用该库,请使用 vendoring,因为在发布 v1.0 之前,我无法确保向后兼容。
示例
文档
godoc.org/github.com/sevlyar/go-daemon
它是如何工作的
我们不能在 Golang 的运行时使用 fork syscall,因为在这种情况下子进程不会继承线程和 goroutine。该库使用了一个简单的技巧:它运行自己的副本,并带有一个标记--一个预定义的环境变量。该变量对进程的可用性意味着在子进程的副本中执行。因此,如果没有设置标记--库会执行父库的操作,并运行带有标记的自己的副本,如果设置了标记--库会执行子库的操作。
func main() { Pre() context := new(Context) child, _ := context.Reborn() if child != nil { PostParent() } else { defer context.Release() PostChild() } }