继续运行Go Server作为后台进程

Mur*_* S. 3 service web-services http go server

无论是否发生错误,我都希望让Golang语言Web服务器保持正常运行.如何继续运行呢?

icz*_*cza 9

我们必须从2个角度检查永远在线的服务器:

  1. 处理/容忍在服务请求期间发生的错误
  2. 如果崩溃或被杀,请重新启动服务器应用程序

首先,你不需要做任何特别的事情.如果您的处理程序发生混乱,它将不会破坏整个服务器,http服务器将从中恢复.它只会停止提供该特定请求.当然,您可以创建自己的处理程序,调用其他处理程序并在恐慌时恢复并以智能方式处理它,但这不是必需的.

这里要注意的一件事是:当maingoroutine结束时,Go应用程序结束(即:main()函数返回).因此,即使服务请求的goroutines受到保护,如果您的主要goroutine将结束(例如恐慌),您的应用程序仍将退出.

对于第二个,它并不真正与Go相关.例如,如果您使用的是Linux,只需将已编译的Go可执行文件作为服务进行安装/注册,并将其正确配置为在其退出或崩溃时重新启动.

例如,在使用systemd进行服务配置的Ubuntu中,以下最小服务描述符将满足您的愿望:

[Unit]
Description=My Always-on Service

[Service]
Restart=always
Type=simple
ExecStart=/path/to/your/app -some=params passed

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

将上述文本放在文件中,例如/etc/systemd/system/myservice.service,您可以启用并启动它:

sudo systemctl enable myservice.service 
sudo systemctl start myservice.service 
Run Code Online (Sandbox Code Playgroud)

第一个命令将符号链接放到正确的文件夹中,以使其在系统启动时自动启动.第二个命令现在启动它.

要验证它是否正在运行,请键入:

sudo systemctl status myservice.service 
Run Code Online (Sandbox Code Playgroud)

(.service在大多数情况下,您可以省略扩展名.)

现在,只要您的应用程序崩溃,或者操作系统重新启动,您的应用程序就会自动启动/重新启动.

systemd的进一步阅读和教程:

如何使用Systemctl管理系统服务和单元

Systemd Essentials:使用服务,单位和期刊

将"run at startup"脚本从upstart转换为systemd,用于Ubuntu 16

systemd:编写和启用服务