如何让我的 Golang Web 服务器在后台运行?

Posted

技术标签:

【中文标题】如何让我的 Golang Web 服务器在后台运行?【英文标题】:How do I get my Golang web server to run in the background? 【发布时间】:2012-09-11 06:55:32 【问题描述】:

我最近完成了Wiki web 开发教程 (http://golang.org/doc/articles/wiki/)。我玩得很开心,我想用 net/http 包进行更多实验。

但是,我注意到当我从控制台运行 wiki 时,wiki 会接管控制台。如果我关闭控制台终端或使用 CTRL+Z 停止进程,则服务器将停止。

如何让服务器在后台运行?我认为这个术语是在守护进程中运行。

我在 Ubuntu 12.04 上运行它。感谢您的帮助。

【问题讨论】:

【参考方案1】:

简单/可用的东西优先

如果您想要一个不费吹灰之力的启动脚本,您可以使用upstart 服务。有关示例,请参见相应的手册页和 /etc/init/*.conf。在创建了这样一个过程之后 你可以通过调用来启动你的服务器

service myserver start

如果您想要更多功能,例如特定限制或权限管理,您可以尝试xinetd

使用外壳

你可以这样开始你的过程:

nohup ./myexecutable &

& 告诉 shell 在后台启动命令,并将其保留在作业列表中。 在某些 shell 上,如果父 shell 使用 HANGUP 信号退出,则作业将被终止。 为防止这种情况,您可以使用nohup 命令启动您的命令,该命令会丢弃 HANGUP 信号。

但是,如果被调用进程重新连接 HANGUP 信号,这将不起作用。

确实,您需要从 shell 的作业列表中删除该进程。 对于两个众所周知的 shell,这可以实现如下:

重击:

./myexecutable &
disown <pid>

zsh:

./myexecutable &!

杀死你的后台工作

通常,shell 会打印进程的 PID,然后可以使用kill 命令将其终止,以停止服务器。如果你的 shell 不打印 PID,你可以使用

echo $!

执行后直接。这将打印分叉进程的 PID。

【讨论】:

那我要怎么回去停止,或者重启呢? &amp; 在您关闭终端时仍会使用命令(取决于您的外壳)。在 bash 中,您需要在使用 &amp;ctrl+Z 进行后台处理后,在其中运行 screennohupdisown @lunixbochs,您不依赖于 shell 的行为可能是对的。我会更新我的答案。 感谢您提供如此详细的回答!如果您在启动后台进程时忘记记录 PID,我可以看到像 upstart 这样的程序会很方便。我将试验这两种技术并报告。 我刚刚尝试使用 bash 版本 5.0.17(1)-release 的 &amp;!,它成功了。【参考方案2】:

您可以使用Supervisord 来管理您的流程。

【讨论】:

监控是另一种选择。【参考方案3】:

Ubuntu?使用upstart

/etc/init 中为您的工作创建一个文件,命名为your-service-name.conf

start on net-device-up
exec /path/to/file --option

您可以使用start your-service-name,以及:stoprestartstatus

【讨论】:

Upstart 似乎已被 systemd 取代,不是吗?现在怎么办?在 Ubuntu LTS 14.04 sudo service start your-service-name 不起作用,找不到服务【参考方案4】:

这将使用systemd 配置您的服务,这不是一个全面的教程,而是如何设置的快速入门。

app.service 文件的内容

[Unit]  
Description=deploy-webhook service
After=network.target

[Service]      
ExecStart=/usr/bin/go webhook.go    
WorkingDirectory=/etc/deploy-webhook

User=app-svc      
Group=app-svc

Restart=always    
RestartSec=10    
KillSignal=SIGINT

SyslogIdentifier=deploy-webhook-service      
PrivateTmp=true  

Environment=APP_PARAM_1=ParamA
Environment=APP_PARAM_2=ParamB

[Install]      
WantedBy=multi-user.target  

启动服务

sudo systemctl start deploy-webhook.service

服务状态

sudo systemctl status deploy-webhook.service

日志

journalctl -u deploy-webhook -e

【讨论】:

【参考方案5】:

按下 ctrl+z (使当前任务进入睡眠状态)后,您可以在终端(代表后台)中运行命令 bg 让最新任务继续在后台运行。

如果需要,请运行 fg 以返回任务。

要获得相同的结果,您可以在命令末尾添加&amp; 以在后台启动它。

【讨论】:

以上是关于如何让我的 Golang Web 服务器在后台运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的用 Golang 编写的 Web 服务器支持 HTTP/2 服务器推送?

如何让我的应用在后台运行 NSTimer?

如何让我的 android 应用程序在后台运行?

有没有办法让我的 WatchKit 应用程序在后台运行?

我需要让我的应用程序总是在后台运行。

让我的活动在后台运行以收集 gps [重复]