【问题标题】:keep server running on EC2 instance after ssh is terminatedssh 终止后保持服务器在 EC2 实例上运行
【发布时间】:2014-02-07 06:15:47
【问题描述】:

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

【问题讨论】:

标签: ssh amazon-ec2


【解决方案1】:

对于那些通过谷歌搜索登陆这里的人,我想添加 tmux 作为另一个选项。 tmux 被广泛用于此目的,预装在新的 Ubuntu EC2 实例上。

管理单个会话

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

我会使用终端多路复用器 - screen 是最著名的,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+BD

列出所有活动会话:

tmux list-sessions

连接到命名会话:

tmux attach-session -t session_name

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

tmux kill-session -t session_name

【讨论】:

  • 当你想断开/分离时,你按Ctrl+B然后立即按D! (即按Ctrl+B,然后松开两个键,然后立即按d)
【解决方案2】:

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

screen 即使您关闭连接也会继续在您的服务器上运行 - 因此您在其中启动的每个进程也将继续运行。

【讨论】:

  • Screen 是一个不错的选择,尤其是对于 OP 的用例。很多人也喜欢 tmux,对于更高级的使用需求,这可能是一个更好的选择
  • 如何在我只有会话的 EC2 Ubuntu 实例上安装它
【解决方案3】:

如果您提供有关您的环境的更多信息会很好,但假设它是 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 的通知)

【讨论】:

  • 我正在运行 Ubuntu,我会测试你的建议。谢谢!
  • 我认为 mongodb 正在运行,因为 mongod 包含在 init.d 文件夹中。但是该语句不起作用'python yourbottlepyapp.py &'...
  • 它有什么作用?程序退出?
  • 对。 SSH 会话结束后,python 瓶服务器停止。我想也许我应该在 /etc/init/ 文件夹中放一个 .cong 文件?
  • 最好的办法可能是使用 apache mod_wsgi 运行它。
【解决方案4】:

您将希望已启动的服务与控制终端断开连接。我建议您使用nohup 来执行此操作,例如

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

您可能需要将& 放在那里(在引号中)以在后台运行它。

正如其他人评论的那样,如果您运行正确的初始化脚本来启动/停止服务(或 ubuntu 的 service 命令),您应该不会看到这个问题。

【讨论】:

    【解决方案5】:

    如果在基于 Linux 的实例上将作业置于后台然后 disown 似乎可以完成这项工作。

    $ ./脚本 & $拒绝

    【讨论】:

      猜你喜欢
      • 2013-05-01
      • 1970-01-01
      • 2017-05-01
      • 2013-12-23
      • 2020-03-26
      • 2016-05-17
      • 1970-01-01
      • 2022-10-09
      • 2017-03-31
      相关资源
      最近更新 更多