【发布时间】:2021-06-07 22:52:25
【问题描述】:
我使用echo framework 创建我的 API 服务器。它由 systemd 启动,默认需要 root,以便获取 1024 以下的端口。为了安全,我喜欢在监听端口被删除后 降级我的 go 程序的权限由 echo 框架获取。
我知道如何降级,但是我找不到合适的事件/回调?问题是,echo.Start() 和 echo.StartAutoTLS() 不会回来。我可以创建一个并行线程并尝试找到我的回显会话的一些状态值,告诉我端口已打开,但我也找不到这样的状态指示。
如何确保在获取端口后执行某些代码(并且确定)?
到目前为止,我在创建服务器之前运行了一个并行 go 线程,然后等待 5 秒进行降级。到目前为止它有效,但这很hacky,我不喜欢它:-(
【问题讨论】:
-
这能回答你的问题吗? stackoverflow.com/q/41248866/13860
-
TL;DR;由于它的线程模型,你正在尝试的东西在 Go 中很难甚至是不可能的。通常最好使用变通方法。
-
你可以试试“ListenerAddr()”,它不应该在“Start”打开端口之前返回,因为它被“startupMutex”锁定了
-
@lumos0815 这成功了!我在我的额外线程中循环,直到它不返回 nil。如果它回来,端口已打开,我可以降级。如果您单独输入,我可以将其标记为解决方案!这就是我解决的方法: func descendPrivileges(e *echo.Echo, userName string) { for { adr := e.ListenerAddr() if adr != nil {gradeMe(userName) break } time.Sleep(100 * time.Millisecond ) } }