我想保持我的Golang语言Web服务器的工作状态,无论是否发生错误。如何始终保持运行?
我们必须从2个角度检查始终在线服务器:
- 处理请求期间发生的错误/容忍错误
- 如果服务器崩溃或杀死,重新启动了服务器应用程序
首先,您不必做任何特别的事情。如果您的处理程序恐慌不会吹整个服务器,则HTTP服务器将从其中恢复。它只会停止服务于该特定请求。当然,您可以创建自己的处理程序,该操作人员调用其他处理程序并以智能方式恢复并恢复它,但这不是必需的。
在这里要注意的一件事: main
goroutine结束时,GO应用程序结束(也就是说:main()
函数返回(。因此,即使保护请求的goroutines也受到保护,如果您的主要goroutine将结束(例如, PANIC(,您的应用仍将退出。
在第二个方面,它并没有真正相关。例如,如果您在Linux上,只需安装/注册您的编译后的可执行文件作为服务,就可以正确配置以使其退出或崩溃。
例如,在Ubuntu中使用SystemD进行服务配置,以下最小服务描述符将满足您的愿望:
[Unit]
Description=My Always-on Service
[Service]
Restart=always
Type=simple
ExecStart=/path/to/your/app -some=params passed
[Install]
WantedBy=multi-user.target
将上述文本放入文件中,例如/etc/systemd/system/myservice.service
,您可以启用并以:
sudo systemctl enable myservice.service
sudo systemctl start myservice.service
第一个命令将符号链接放置到适当的文件夹,以使其自动启动在系统启动上。第二个命令立即开始。
要验证它是否正在运行,请输入:
sudo systemctl status myservice.service
(您可以在大多数情况下省略.service
扩展。(
现在,每当您的应用程序崩溃或重新启动操作系统时,您的应用将自动启动/重新启动。
SystemD的进一步阅读和教程:
如何使用SystemCTL管理SystemD服务和单位
SystemD Essentials:使用服务,单位和期刊
将"在启动"脚本从Upstart转换为Ubuntu 16
的SystemDSystemD:编写和启用服务
您可以做的很少的事情。例如,
- 如果您担心恐慌,则只需将服务器作为背景过程运行即可。用户@终端# Go Run Server.go&
- 否则,对于服务器崩溃,您可以编写shell脚本以重新运行并杀死旧过程。