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

时间:2017-04-27 06:30:39

标签: web-services http go service server

我想让Golang语言Web服务器保持正常运行,无论是否发生错误。 如何继续运行它?

2 个答案:

答案 0 :(得分:6)

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

  1. 处理/容忍在服务请求期间发生的错误
  2. 重启服务器应用程序,如果它崩溃或被杀死
  3. 首先,你不需要做任何特别的事情。如果您的处理程序发生混乱,它将不会破坏整个服务器,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

    systemd: Writing and Enabling a Service

答案 1 :(得分:1)

你可以做的事情很少。如,

  1. 如果您担心恐慌,只需将服务器作为后台进程运行即可。 user @ terminal# go run server.go&
  2. 否则,对于服务器崩溃,您可以编写Shell脚本来重新运行它并终止旧进程。