- Go 特性:Go 本质上是多线程的,这使得传统通过 fork 使 Go 程序成为守护进程的方法有些困难。
- 绕过方法一:可尝试将 Go 程序后台运行并指示其忽略 HUP 信号,如
nohup your-go-binary &
,但此方法不适用于需能停止和启动的 Web 服务器,且不是理想的转为守护进程的方式,因为它不能完成守护进程的常见任务。 - 使用 daemonize 库:
daemonize
可将命令作为 Unix 守护进程运行,自动执行上述任务并可重定向 stdout 和 stderr 到指定文件,如daemonize -o stdout.log -e stderr.log /absolute/path/to/go-program
。 Archlinux 中的示例:在 Archlinux 中,将 Go 程序设为守护进程的方式类似其他常见守护进程,以
/etc/rc.d/blog-burntsushid
为例,其脚本内容如下:- 包含相关配置文件和函数。
- 定义各种变量,如
name
(守护进程名称)、logOut
和logErr
(日志文件)、full
(Go 二进制文件的绝对路径)、cmd
(daemonize
命令)、user
(运行守护进程的用户)等。 - 可根据需求进行
start
(启动)、stop
(停止)、reload
(重载)、restart
(重启)操作,通过su
以指定用户运行cmd
。
- 参考资料:Archlinux 维基关于编写 rc.d 脚本有更多信息。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。