EC2 ssh 注销后丢失控制台

EC2 ssh 注销后丢失控制台

我在 EC2 上运行 Java 应用程序作为服务器。但是当我失去 ssh 连接时,所有控制台消息也都丢失了。当我将所有消息重定向到> my.log然后使用时,tail -f my.log我没有收到e.printstacktrace消息。我想知道我该怎么办。

我可以做一些简单的事吗?重新登录 ssh,找出 java 应用程序抛出所有消息的控制台。

因此,我现在不再执行java myapp.jar &,而是执行java myapp.jar,这样我就不会丢失任何控制台消息。

另一个问题是,有没有比> my.log这个更好的命令,不会错过我的应用程序的任何消息,以便我可以记录并执行tail -f my.log

答案1

我会使用终端多路复用器 - 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 教程将会教给你更多,并且还有更多。

答案2

如果您想在断开连接时让进程保持运行并稍后查看所有输出,则会遇到一些问题。

捕获错误消息

您的方法的一个问题是,您只重定向了 stdout,但没有重定向 stderr,因此错误消息不会进入文件。重定向所有输出的标准用法是:

java myapp.jar 2>&1 > myapp.log

这解释了 2>&1 的含义这给出了有关 bash i/o 重定向的章节和诗句

如果你想看到差异,你可以这样做

java myapp.jar > myapp.log 2> myapp.err

断开连接时保持进程运行

即使在后台运行(通过附加&到命令),进程仍然附加到终端。当终端死亡时,所有子进程都将被终止,包括后台的子进程。

为了让它们存活,你可以

  • 使用终端多路复用器,即使失去连接也能保持终端活动(请参阅我的其他答案或者,
  • 使用禁止这将保持命令运行(通过忽略SIGHUP)。

要使用 nohup,将所有输出重定向到日志并将其放入后台,您只需执行以下操作:

nohup java myapp.jar 2>&1 > myapp.log &

有关 nohup 的更多信息

相关内容