49

我最近完成了Wiki Web 开发教程http://golang.org/doc/articles/wiki/)。我有很多乐趣,我想尝试更多的 net/http 包。

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

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

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

4

5 回答 5

65

简单/可用的东西优先

如果您想要一个不费吹灰之力的启动脚本,您可以使用该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。

于 2012-09-19T00:03:33.670 回答
9

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

于 2012-09-18T23:52:44.013 回答
6

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

于 2012-09-19T00:17:07.127 回答
3

这将使用 配置您的服务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
于 2019-12-22T06:02:28.680 回答
1

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

需要时,运行fg以返回任务。

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

于 2019-12-22T06:08:01.677 回答