英文:
Keep running Go Server as background process
问题
我想要无论是否发生错误,都能保持我的 Golang 语言 Web 服务器运行。如何让它始终保持运行?
英文:
I want to keep my Golang language web server working regardless of an error happens or not.
How to keep running it always?
答案1
得分: 14
我们需要从两个角度检查一个始终运行的服务器:
- 处理/容忍在处理请求时发生的错误。
- 如果服务器应用程序崩溃或被终止,重新启动服务器应用程序。
对于第一个问题,你不需要做任何特殊处理。如果你的处理程序发生恐慌,它不会导致整个服务器崩溃,HTTP服务器将从中恢复。它只会停止处理该特定请求。当然,你可以创建自己的处理程序,调用其他处理程序,并在恐慌时进行恢复,并以智能的方式处理它,但这不是必需的。
这里需要注意的一点是:Go应用程序在main
goroutine结束时结束(即:main()
函数返回)。因此,即使处理请求的goroutine受到保护,如果主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的进一步阅读和教程:
将“在启动时运行”脚本从Upstart转换为Ubuntu 16的Systemd
英文:
We have to inspect an always-on server from 2 perspectives:
- Handle / tolerate errors that occur during serving requests
- Restart the server app if it crashes or gets killed
For the first, you don't have to do anything special. If your handler panics, it will not blow your whole server, the http server will recover from that. It will only stop serving that specific request. Of course you can create your own handler which calls other handlers and recovers on panic and handle it in an intelligent way, but this is not a requirement.
<sup>One thing to note here: a Go app ends when the main
goroutine ends (that is: the main()
function returns). So even though goroutines serving requests are protected, if your main goroutine would end (e.g.
panic), your app would still exit.</sup>
For the second, it's not really Go related. For example if you're on linux, simply install / register your compiled Go executable as a service, properly configured to have it restarted should it exit or crash.
For example in Ubuntu which uses systemd for service configuration, the following minimal service descriptor would fulfill your wishes:
[Unit]
Description=My Always-on Service
[Service]
Restart=always
Type=simple
ExecStart=/path/to/your/app -some=params passed
[Install]
WantedBy=multi-user.target
Put the above text in a file e.g. /etc/systemd/system/myservice.service
, and you can enable and start it with:
sudo systemctl enable myservice.service
sudo systemctl start myservice.service
The first command places a symlink to the proper folder to have it auto-started on system startup. The second command starts it right now.
To verify if it's running, type:
sudo systemctl status myservice.service
(You can omit the .service
extension in most cases.)
Now whenever your app crashes, or the OS gets restarted, your app will be automatically started / restarted.
Further reading and tutorials for 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
答案2
得分: 1
有几件事情你可以做。比如,
- 如果你担心程序崩溃,可以将服务器作为后台进程运行。
user@terminal# go run server.go & - 否则,对于服务器崩溃的情况,你可以编写Shell脚本来重新运行它并杀死旧的进程。
英文:
There are few things which you can do. Such as,
- If you are worrying about panics, the simply run the server as a background process.
user@terminal# go run server.go & - Otherwise, for server crashes, you may write Shell script to re-run it and kill the old process.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论