我有一个具有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
答案 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容器中部署应用程序。