我想让Golang语言Web服务器保持正常运行,无论是否发生错误。 如何继续运行它?
答案 0 :(得分:6)
我们必须从2个角度检查永远在线的服务器:
首先,你不需要做任何特别的事情。如果您的处理程序发生混乱,它将不会破坏整个服务器,http服务器将从中恢复。它只会停止提供该特定请求。当然,您可以创建自己的处理程序,调用其他处理程序并在恐慌时恢复并以智能方式处理它,但这不是必需的。
有一点需要注意:当main
goroutine结束时(即main()
函数返回),Go应用程序结束。因此,即使服务请求的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
将上述文字放在一个文件中,例如/etc/systemd/system/myservice.service
,您可以启用并启用它:
sudo systemctl enable myservice.service
sudo systemctl start myservice.service
第一个命令将符号链接放到正确的文件夹中,以便在系统启动时自动启动它。第二个命令现在就开始了。
要验证它是否正在运行,请输入:
sudo systemctl status myservice.service
(在大多数情况下,您可以省略.service
扩展名。)
现在,只要您的应用崩溃,或操作系统重新启动,您的应用就会自动启动/重新启动。
systemd的进一步阅读和教程:
How To Use Systemctl to Manage Systemd Services and Units
Systemd Essentials: Working with Services, Units, and the Journal
Convert "run at startup" script from upstart to systemd for Ubuntu 16
答案 1 :(得分:1)
你可以做的事情很少。如,