简介

因为最近用go语言开发了一个websocket服务,启动后需要后台运行,还希望异常退出时可以自动重启。整体思路是启动程序后,转为后台运行,这个后台程序暂且称为守护进程(daemon)。它不处理具体业务逻辑,只是再次按一样的参数调用自身,启动一个子进程,有子进程负责业务逻辑处理。守护进程监视子进程状态,若退出则再次启动一次。如此可以保证服务异常中止时可以及时重启。

该库很方便保持参数不变另外启动一个后台进程,但如果后台进程再次尝试启动自身为另外一个后台进程,则会出现错误。后来阅读源码发现:为了区分当前进程是父进程还是子进程,作者巧妙的设计了一个环境变量标识,用于标记子进程。也正是因为这种识别策略,此库只能启动一次自身为后台进程,不能连续启动自身为后台进程。不过使用环境变量来区分进程身份的思路,对我启发很大。在此基础上经过延伸和优化,最终实现了在保持参数不变的情况可以连续启动自身为后台进程。

区分两个概念

后台运行daemon 在平常沟通中我们可能不太区分,或者区分得比较模糊。在本文所指中,我要明确区分一下:

后台运行:是指进程在操作系统中非显示运行未关联到任何命令行终端或程序界面。这中方式运行的进程则称为后台进程,如未关联到任何终端的命令行程序进程。

daemon:也叫守护进程,它首先是后台运行,然后它还有守护的职责。本文所指,是希望守护进程可以监视go服务程序进程的状态,若异常退出,可以自动重启服务程序

首先排除的方案

nohub、&、setsid都可以让程序在后台运行,但这是平台相关的,只适用于类unix系统。若使用此类方案,那这个库在windows下是无法工作的,不太完美。先不说支持所有平台,我期望这个库至少能支持类unix系统和windows系统。

引用

import github.com/kardianos/service

来源:
作者:一个认真的技术人
链接:https://www.jianshu.com/p/ccf0748d0e6d