简介
因为最近用go语言开发了一个websocket服务,启动后需要后台运行,还希望异常退出时可以自动重启。整体思路是启动程序后,转为后台运行,这个后台程序暂且称为守护进程(daemon)。它不处理具体业务逻辑,只是再次按一样的参数调用自身,启动一个子进程,有子进程负责业务逻辑处理。守护进程监视子进程状态,若退出则再次启动一次。如此可以保证服务异常中止时可以及时重启。
该库很方便保持参数不变另外启动一个后台进程,但如果后台进程再次尝试启动自身为另外一个后台进程,则会出现错误。后来阅读源码发现:为了区分当前进程是父进程还是子进程,作者巧妙的设计了一个环境变量标识,用于标记子进程。也正是因为这种识别策略,此库只能启动一次自身为后台进程,不能连续启动自身为后台进程。不过使用环境变量来区分进程身份的思路,对我启发很大。在此基础上经过延伸和优化,最终实现了在保持参数不变的情况可以连续启动自身为后台进程。
区分两个概念
后台运行 和 daemon 在平常沟通中我们可能不太区分,或者区分得比较模糊。在本文所指中,我要明确区分一下:
后台运行:是指进程在操作系统中非显示运行,未关联到任何命令行终端或程序界面。这中方式运行的进程则称为后台进程,如未关联到任何终端的命令行程序进程。
daemon:也叫守护进程,它首先是后台运行,然后它还有守护的职责。本文所指,是希望守护进程可以监视go服务程序进程的状态,若异常退出,可以自动重启服务程序。
首先排除的方案
nohub、&、setsid都可以让程序在后台运行,但这是平台相关的,只适用于类unix系统。若使用此类方案,那这个库在windows下是无法工作的,不太完美。先不说支持所有平台,我期望这个库至少能支持类unix系统和windows系统。
引用
import github.com/kardianos/service
来源:
作者:一个认真的技术人
链接:https://www.jianshu.com/p/ccf0748d0e6d