我想为Go应用程序进行真正优雅的重启,同时仍然能够使用systemd控制它。我在应用中使用了endless。代码很简单(endless.ListenAndServe(":80", nil)
),对于systemd配置文件,到目前为止我设法像这样(goapp.service):
[Unit]
Description=Go Application
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=root
Group=root
WorkingDirectory=/root/go/src/myproject
ExecStart=/root/go/src/myproject/goapp
KillSignal=SIGHUP
Restart=on-failure
然后我只使用systemctl start goapp
启动应用程序,一切都很好,但是当我同时向应用程序发出大量请求时发出systemctl restart goapp
时,重启命令似乎挂起我的终端(而不是杀死/分叉进程),直到它没有请求。当然,当没有请求时,服务会成功重启。
我正在使用这个简单的代码进行测试:
package main
import "net/http"
import "github.com/fvbock/endless"
func handler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello"))
}
func main() {
http.HandleFunc("/", handler)
endless.ListenAndServe(":80", nil)
}
有人可以帮忙吗?我做错了什么?