使 Go 程序守护进程化(带有 BSD 风格的 rc.d 示例)

  • 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(守护进程名称)、logOutlogErr(日志文件)、full(Go 二进制文件的绝对路径)、cmddaemonize命令)、user(运行守护进程的用户)等。
    • 可根据需求进行start(启动)、stop(停止)、reload(重载)、restart(重启)操作,通过su以指定用户运行cmd
  • 参考资料:Archlinux 维基关于编写 rc.d 脚本有更多信息。
阅读 10
0 条评论