2017-07-18 68 views
0

我有一台使用ssh root访问的生产服务器。在那里我安装了并克隆了我的项目,我正在使用putty来运行我的应用程序,但在关闭putty之后,我的应用程序停止工作,我需要做些什么来始终运行应用程序?Go应用程序在生产中运行

这里是我的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 
+0

你在运行什么操作系统? – kichik

+0

我使用的是Ubuntu 16.04 –

回答

3

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

如果您只想一段时间运行一次,并且不介意手动重新启动它,则可以使用nohup命令防止登录会话结束导致程序终止。

nohup go run your-program & 

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

如果这个程序是一个永远不断运行的服务 - 并且因为你提到“生产”,我会假定它是 - 使用@ kichik的解决方案。 nohup而不是运行生产服务器的合理方法。使用@ kichik的方式去做right。这个答案只是让你明白为什么你现在的方法不起作用。

+0

这正是我想要回答的。 –

4

对于最近的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所以它可能是最容易使用。

+0

我已经创建了服务,正如你所说的,但当试图启动它时,我收到以下错误无法启动go.service:单元去。服务未正确加载:参数无效。 –

+0

检查'/ var/log/*'是否有错误,并确保你运行'sudo systemctl enable go' – kichik

+0

我已经命名为'sudo systemctl enable go'并且在日志中没有任何 –

-1

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

您还可以创建一个Docker image并将您的应用程序部署到Docker容器中。

+0

Docker isyyyyy矫枉过正只是为了让服务运行。 – Adrian

+0

作为主管。 _任何Linux发行版都带有一个init系统,不管它是“旧的”[SYS V init](http://savannah.nongnu.org/projects/sysvinit),[systemd](https://www.freedesktop.org/ wiki/Software/systemd /)或[openrc](https://wiki.gentoo.org/wiki/Project:OpenRC)。无论如何引入一个守护进程来保持进程的运行,这反过来又需要由init系统启动 - 而不是立即使用init系统。 –

相关问题