目前,我在EC2
实例(MongoDB
和bottlepy
)上运行了两台服务器。当我连接到实例并启动这两个服务器时,一切正常。但是,当我关闭SSH会话(实例仍在运行)时,我丢失了这两台服务器。退出后有没有办法让服务器保持运行?我在Windows 7上使用Bitvise Tunnelier
。
我使用的实例是Ubuntu Server 12.04.3 LTS。
答案 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& $取消