Golang服务器如何在后台运行的问题

Golang服务器如何在后台运行的问题 我正在使用mux和godaemon,但遇到一个小问题…… 这是我的项目:https://github.com/dimensi0n/flume

今天早上我更新到了godaemon,但当我在后台运行服务器时,我在localhost:8080/auth/all上执行curl请求,服务器似乎没有运行……

但由于godaemon的原因,我无法使用-t标志……我不知道为什么……

14 回复

我想要它 ❤️

更多关于Golang服务器如何在后台运行的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对此也有 Makefile 的魔法实现 😊

是的,但问题是:“我必须为多个操作系统编译它,这将花费我永恒的时间来完成…”

我在Ubuntu 18.04系统上…执行了go build命令,然后运行了./flume

问题已经解决了,我改用Docker后现在它能在后台运行,而且部署起来也更方便了 😜

跨平台编译 Go 代码非常简单,而且与初次编译代码的速度一样快。如果你认为编译 Go 代码需要很长时间,那说明你还不够耐心 😊

根据godaemon的README说明,您需要提供-d=true标志。

// 示例代码
func main() {
    daemon := godaemon.New()
    daemon.Run()
}

你是如何启动你的应用程序的?你在哪个操作系统上运行?

Linux 通常在父进程终止时会杀死子进程。这正是守护进程化所做的:将你的程序作为子进程启动,然后自身退出。

需要提供引用来源。你为何会这样说?我个人更倾向于使用 Docker 来部署应用,而不是去折腾 systemd。这样做还能避免因运行服务而污染文件系统,从而防止服务仅因副作用才能运行的情况发生。

在Docker镜像上运行程序有很多理由,同样也有很多不这么做的理由。无论如何,我同意Norbert的观点:通过隔离无法运行的程序来解决某些潜在问题,这根本算不上修复,而是将其掩盖起来,真正的问题可能会在以后反噬你。

在大多数情况下,Docker并非正确的解决方案。我确信编写合适的systemd单元或初始化脚本(取决于您使用的初始化系统)通常是解决此问题更清晰、更好的方案。此外,为目标系统将其封装在适当的软件包中通常比使用Docker服务要好得多。

只有当您想要使用Kubernetes、集群部署或其他类型的云服务进行部署时,Docker才真正有意义。

没有可引用的来源,这只是个人经验。Docker会破坏包管理器的依赖关系。

当你移除Docker时,你的服务就会停止工作,而apt或yum不会发出警告。

它仅仅为了运行一个10MB的可执行文件,就拉取了整整一个操作系统(100MB或更多,至少许多编写糟糕的Docker镜像就是这种情况),其中包含大量不需要的东西,而这个可执行文件在本机运行效果同样良好。

最后但同样重要的是,Docker中存在一些问题,使得客户机能够更改主机中的某些内容,而这通常需要root权限。

这确实如此。从系统管理员的角度来看,如果您的软件不在可用仓库中,我们就不会部署它。当然有时我们不得不这样做,但最令人恼火的就是那些期望具备互联网访问权限和/或使用随产品打包的特定自定义版本的软件。

“但在我的笔记本上运行得好好的” 某开发者 2018

最糟糕的情况是,开发者依赖的实际上是项目所用技术的每日构建版本,并期望我们在生产环境中也使用这些版本。这根本不可能实现 😛

在生产环境中,您希望所有东西都是可复现的,而这种方式完全不符合要求。Docker也不是解决方案。它只是将您的应用程序放在一个我无法深入了解的小容器中,还需要您/我们在其中添加监控平台等组件。而且为什么要放在容器里?我只会对那些完全无状态且需要分布式运行的东西使用容器。如果容器只是"永久"运行,那我宁愿完全跳过Docker,直接在机器上设置。

在Golang中让服务器在后台运行有几种方法,使用godaemon确实是一个常见的选择,但可能配置有问题。让我分析一下你的情况并提供解决方案。

首先,检查你的godaemon配置是否正确。根据你的项目结构,应该确保main函数正确调用了godaemon:

package main

import (
    "log"
    "net/http"
    "github.com/gorilla/mux"
    "github.com/VividCortex/godaemon"
)

func main() {
    // 启用守护进程模式
    godaemon.MakeDaemon(&godaemon.DaemonAttr{})
    
    r := mux.NewRouter()
    r.HandleFunc("/auth/all", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Server is running in background"))
    }).Methods("GET")
    
    log.Println("Server starting on :8080")
    if err := http.ListenAndServe(":8080", r); err != nil {
        log.Fatal("Server failed to start:", err)
    }
}

如果你遇到godaemon的问题,这里有几个替代方案:

方案1:使用nohup(Unix/Linux系统)

nohup go run main.go &

方案2:使用systemd(生产环境推荐) 创建服务文件 /etc/systemd/system/your-service.service

[Unit]
Description=Your Go Service
After=network.target

[Service]
Type=simple
User=your-user
WorkingDirectory=/path/to/your/project
ExecStart=/path/to/your/binary
Restart=always

[Install]
WantedBy=multi-user.target

然后启用并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable your-service
sudo systemctl start your-service

方案3:使用screen/tmux

# 使用screen
screen -S myserver
go run main.go
# 按Ctrl+A然后D detached

# 重新连接
screen -r myserver

方案4:直接构建并后台运行

go build -o server
./server &

检查你的godaemon版本兼容性,确保它与你的Go版本匹配。如果问题持续,可以尝试在启动后检查进程状态:

ps aux | grep your-server
netstat -tlnp | grep 8080

这样可以确认服务器是否真的在运行并监听指定端口。

回到顶部