Go application在生产中运行

Yur*_*yan 3 linux

我有一个具有ssh root访问权限的生产服务器.我已经安装了go并克隆了我的项目,我正在使用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
Run Code Online (Sandbox Code Playgroud)

kic*_*hik 7

对于最新版本的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
Run Code Online (Sandbox Code Playgroud)

运行一次:

systemctl enable myservice
Run Code Online (Sandbox Code Playgroud)

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

sudo systemctl start myservice
sudo systemctl stop myservice
Run Code Online (Sandbox Code Playgroud)

它也将在服务器引导时自动启动,如果崩溃则重新启动.

更多信息:

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

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


Joe*_*hon 5

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

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

nohup go run your-program &
Run Code Online (Sandbox Code Playgroud)

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

如果这个程序是一个永远在线,持续运行的服务 - 并且因为你提到"生产",我会认为它是 - 使用@ kichik的解决方案.nohup不是运行在生产服务器的合理方法.用@ kichik的方法做.这个答案就是让您理解为什么您当前的方法不起作用.