我在 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
断开连接时保持进程运行
即使在后台运行(通过附加&
到命令),进程仍然附加到终端。当终端死亡时,所有子进程都将被终止,包括后台的子进程。
为了让它们存活,你可以
要使用 nohup,将所有输出重定向到日志并将其放入后台,您只需执行以下操作:
nohup java myapp.jar 2>&1 > myapp.log &