Go application在生产中运行

时间:2017-07-18 21:16:15

标签: linux

我有一个具有ssh root访问权限的生产服务器。我已经安装了go并克隆了我的项目,我正在使用putty来运行我的应用程序但是在关闭putty之后我的go应用程序停止工作,我需要做什么才能始终运行go application?

这是我的go.service文件

[Unit]
Description=my amazing service

[Service]
Restart=always
RestartSec=3
ExecStart=go run /root/work/src/main/main.go

[Install]
WantedBy=multi-user.target

3 个答案:

答案 0 :(得分:6)

对于最新版本的Ubuntu,请创建/etc/systemd/system/myservice.service

[Unit]
Description=my amazing service

[Service]
Restart=always
RestartSec=3
ExecStart=/usr/bin/path/to/my/service some args

[Install]
WantedBy=multi-user.target

运行一次:

systemctl enable myservice

然后您可以使用以下命令启动和停止服务:

sudo systemctl start myservice
sudo systemctl stop myservice

它也将在服务器启动时自动启动,并在崩溃时重新启动。

更多信息:

https://wiki.ubuntu.com/SystemdForUpstartUsers#Example_Systemd_service

还有许多其他服务管理解决方案,但systemd附带Ubuntu 16,因此它可能是最容易使用的。

答案 1 :(得分:5)

猜测很多细节,你可能正在进行中,在命令行启动程序并关闭连接。正在发生的事情是在Unix中正常的会话终止:当登录shell退出时,它下面的所有正在运行的进程都会发送一个HUP信号(“hangup”的缩写,可以追溯到连接断开意味着电话线连接到机器已挂断)。

如果您想要做的只是偶尔运行一次并且不介意必须手动重启,那么您可以使用nohup命令来阻止登录会话的结束导致程序终止。

nohup go run your-program &

这会在后台运行您的程序,并阻止它接收HUP信号。您现在可以断开SSH会话,程序将继续运行。

如果这个程序是一个永远在线的,持续运行的服务 - 并且因为你提到“生产”,我会认为它是 - 使用@ kichik的解决方案。 nohup 不是运行生产服务器的合理方式。使用@ kichik的方式正确。这个答案让您理解为什么您当前的方法无效。

答案 2 :(得分:0)

像kichik所说,你可以编写一个systemd脚本。作为替代方案,您可以使用supervisor。它可以在服务器启动时自动启动应用程序,并支持应用程序崩溃时自动重启。

您还可以创建Docker image并在Docker容器中部署应用程序。