如何让我的 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。
【讨论】:
那我要怎么回去停止,或者重启呢?&
在您关闭终端时仍会使用命令(取决于您的外壳)。在 bash 中,您需要在使用 &
或 ctrl+Z
进行后台处理后,在其中运行 screen
、nohup
或 disown
。
@lunixbochs,您不依赖于 shell 的行为可能是对的。我会更新我的答案。
感谢您提供如此详细的回答!如果您在启动后台进程时忘记记录 PID,我可以看到像 upstart 这样的程序会很方便。我将试验这两种技术并报告。
我刚刚尝试使用 bash 版本 5.0.17(1)-release 的 &!
,它成功了。【参考方案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
,以及:stop
、restart
、status
【讨论】:
Upstart 似乎已被 systemd 取代,不是吗?现在怎么办?在 Ubuntu LTS 14.04sudo 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
以返回任务。
要获得相同的结果,您可以在命令末尾添加&
以在后台启动它。
【讨论】:
以上是关于如何让我的 Golang Web 服务器在后台运行?的主要内容,如果未能解决你的问题,请参考以下文章