ssh终止后,保持服务器在EC2实例上运行

时间:2014-01-17 19:13:04

标签: ssh amazon-ec2

目前,我在EC2实例(MongoDBbottlepy)上运行了两台服务器。当我连接到实例并启动这两个服务器时,一切正常。但是,当我关闭SSH会话(实例仍在运行)时,我丢失了这两台服务器。退出后有没有办法让服务器保持运行?我在Windows 7上使用Bitvise Tunnelier。 我使用的实例是Ubuntu Server 12.04.3 LTS。

5 个答案:

答案 0 :(得分:14)

对于那些从谷歌搜索登陆的人,我想添加tmux作为另一种选择。 tmux被广泛用于此目的,并且预装在新的Ubuntu EC2实例上。

管理单个会话

以下是Hamish Downer在askubuntu.com上similar question给出的一个很好的答案:

  

我会使用终端多路复用器 - 屏幕是最知名的,而tmux是这个想法的最新实现。我使用tmux,并建议你去做。

     

基本上,tmux将在计算机上运行终端(或一组终端)。如果在远程服务器上运行它,则可以在没有终端死机的情况下断开它。然后,当您稍后再次登录时,您可以重新连接,并查看您错过的所有输出。

     

要在第一次启动它,只需输入

即可
tmux
     

然后,当您要断开连接时,执行 Ctrl + B D (即按Ctrl + B,然后释放两个键,然后按d)

     

再次登录时,您可以运行

tmux attach
     

然后你将重新连接到tmux并查看发生的所有输出。请注意,如果您不小心丢失了ssh连接(假设您的网络出现故障),则tmux仍将运行,但它可能认为它仍然连接到连接。您可以告诉tmux从最后一个连接分离并通过运行

连接到新连接
tmux attach -d
     

事实上,您可以一直使用-d选项。在服务器上,我在我的> .bashrc

中有这个
alias tt='tmux attach -d'
     

因此,当我登录时,我只需输入tt并重新连接即可。你可以更进一步>如果你想要并将命令集成到ssh的别名中。我在服务器上运行tmux中的邮件客户端>我有一个本地别名:

alias maileo='ssh -t mail.example.org tmux attach -d'
     

这对服务器执行ssh并在最后运行命令 - tmux attach -d -t选项确保终端启动 - 如果提供了命令,则它不会在终端中运行默认。所以现在我可以在本地命令行上运行maileo并连接到服务器和tmux会话。当我从tmux断开连接时,ssh连接也被终止。

     

这显示了如何将tmux用于特定用例,但tmux可以做更多的事情。这个tmux tutorial会教你更多,而且还有很多。

管理多个会话

如果您需要同时在后台运行多个进程,这可能很有用。为了有效地执行此操作,将为每个会话命名。

启动(并连接)新的命名会话:

tmux new-session -s session_name

如上所述从任何会话中分离: Ctrl + B D

列出所有有效会话:

tmux list-sessions

连接到指定的会话:

tmux attach-session -t session_name

要杀死/停止会话,您有两种选择。一种选择是在连接到要杀死的会话时输入exit命令。另一种选择是使用命令:

tmux kill-session -t session_name

答案 1 :(得分:9)

如果您不想将某个进程作为服务(或通过apache模块)运行,您可以(就像我使用IRC一样)使用gnome-screen Install screen http://hostmar.co/software-small

即使您关闭连接,

screen也会继续在您的服务器上运行 - 因此您启动的每个进程也将继续运行。

答案 2 :(得分:2)

您将希望已启动的服务与控制终端断开连接。我建议您使用nohup来做到这一点,例如

ssh my.server "/bin/sh -c nohup /path/to/service"

您可能需要在{(1}}中放置(在引号中)以在后台运行它。

正如其他人所评论的,如果你运行适当的init脚本来启动/停止服务(或ubuntu的&命令),你就不应该看到这个问题。

答案 3 :(得分:1)

如果您提供有关您的环境的更多信息,但假设它是Ubuntu Linux,您可以在后台启动服务或作为守护进程,这将是很好的。

sudo service mongodb start
nohup python yourbottlepyapp.py &

(如果你想要在一个ssh会话中使用nohup,并希望阻止它关闭文件描述符)

您还可以使用Apache mod_wsgi运行您的bottle.py应用。 (在apache服务下运行)更多信息:http://bottlepy.org/docs/dev/deployment.html

希望这有帮助。

添加:(您的流程在退出ssh会话后仍然运行)

举个例子time.py

 import time
 time.sleep(3600)

然后运行:

 $ python3 time.py &
 [1] 3027
 $ ps -Af | grep -v grep | grep  time.py
 ubuntu    3027  2986  0 18:50 pts/3    00:00:00 python3 time.py
 $ exit

然后ssh回到服务器

 $ ps -Af | grep -v grep | grep  time.py
 ubuntu    3027     1  0 18:50 ?        00:00:00 python3 time.py

流程仍在运行(没有tty的通知)

答案 4 :(得分:0)

如果在基于Linux的实例上,将工作放在后台,然后将其取消似乎可以完成工作。

$ ./script& $取消