我希望访问打开终端,即在我的计算机上本地打开的终端,无需使用tmux
或即可从远程计算机打开screen
。 出现这种情况有几个原因,其中最简单的原因是我总是遇到这样一种情况:我没有提前计划,在工作时在 PC 上运行一些大程序,回家后想通过 ssh 检查它。
本质上,我正在寻找一种方法来连接到计算机上已经运行的终端并查看其输出。
现在,我知道有一些帖子说你不能这样做(例如这个)以及其他只是推荐screen
和tmux
(如这个,这个或者这个)我正在寻找一种方法来直接地访问正在运行的终端进程,或者至少查看该终端的缓存输出。我不一定需要能够在该终端中输入命令。
有办法吗?否则,有什么可行的办法吗?我想我可以找到一种方法来自动将 stdout、stderr 和命令记录到文件中(也许是对 bash 历史记录进行巧妙的调整以记录所有内容?)
答案1
由于终端的构造方式,无法访问一切即您无法查看正在运行的终端和如果您没有在所述终端内运行可分离会话(例如screen
或tmux
会话),或者如果您尚未通过script
命令记录启动该命令,请与其交互。
可以做的只是部分看法TTY 通过sudo cat /dev/vcs1
命令。/dev/vcs[1-6]
对应于各自的 TTY 控制台。这受各自 TTY 的回滚缓冲区大小限制,这意味着您只能看到内存中保存的行数不超过一定数量。当然,可以调整以增加行数,如muru 的回答在这里。或者,你也许应该尝试
setterm -file log.txt -dump [ttynumbers]
其中提到这个 ssh 问题。
在一天结束时,菩提坐禅正确地注意到他们的评论,你拒绝使用screen
或tmux
才是最大的问题。我完全理解,我自己也经常忘记跟踪长时间运行的程序,但对于某些命令,你应该开始提前思考。
答案2
由于您已标记此gnome 终端,根据版本,可能可以查看部分输出。从这篇博文,作者想看看 GNOME 终端如何实现“无限”回滚:
我可以看看哪些文件
gnome-terminal
打开了,这样就lsof
解决了问题。然后我发现它很狡猾,它打开了一些文件/tmp/vteXYZ1tv
,但它已经删除了它们。因此,您在浏览时看不到它们,程序关闭时它们将被删除。[...] 不过,它们可以恢复,我的方法(可能还有其他方法)是执行一个ls -l /proc/<gnome-terminal pid>/fd
来查看它们指向什么。然后您可以使用cat
它们来创建一个新文件。这些只是终端输出的逐字副本。没有压缩。什么都没有。
但在新版本中,这些文件应该是加密的。这个答案:
vte-0.40(很可能会出现在 Ubuntu 15.10 WW 中)将压缩并加密这些文件。这将使所需存储空间缩小到其大小的约三分之一到四分之三(如果您的应用程序以纯文本形式生成 X 量数据,则 X/4 到 X/3 之间的某个位置是所需存储空间的合理估计),并且还可以消除隐私/安全问题,以防有人获得对硬盘的原始访问权限。
如果你只想要未来的输出,你可以尝试将过程拖到使用 reptyr 创建新的 TTY。
答案3
根据终端内运行的进程,你可能会成功窥视该过程的状态和所采取的行动而不是在终端上显示的内容。
举几个例子,假设您已经以某种方式找出了给定进程的 PID(进程 ID)(例如使用pidof
或ps
):
如果给定的工具逐个启动子命令,请使用 检查哪个命令正在运行
ps
。如果给定的工具有时会改变其工作目录,请检查
/proc/<PID>/cwd
。如果给定的工具连续操作多个文件,请检查哪个文件在 下打开
/proc/<PID>/fd
。如果您现在看不到任何文件,可能是您的进程刚刚关闭了一个文件,即将打开下一个文件;请再次检查几次该目录的内容。read
如果命令使用标准/系统调用对单个大文件进行操作write
,则可以在 下找到文件描述符编号/proc/<PID>/fd
,并检查 下相应文件中的当前偏移量/proc/<PID>/fdinfo
。如果命令使用pread
/pwrite
,则请参阅下一个要点。您可以使用以下命令连接到进程
strace
以查看其正在执行的操作:strace -p <PID>
。之后使用Ctrl+退出C(它strace
仅终止,而不是您正在跟踪的应用程序)。检查输出并查找可能给您带来启发的相关内容。例如,使用选项将此输出限制为仅文件操作。您将看到应用程序正在打开的文件名,以及/操作发生的-e trace
偏移量。pread
pwrite
答案4
从评论来看,有几种潜在的解决方案,但它们都必须在图形终端中运行命令之前实施。
例如,参见https://bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug/1356433
因此,同一 X 会话内的用户无法重新连接到已关闭的选项卡。
您可以按照 muru 的建议尝试 reptyr,这是一个很酷的解决方案,但最好从一开始就更好地规划您的 ssh 会话。
您需要制定更好的工作策略。
- 使用 screen 或 tmux 或类似工具。这些工具正是为这种情况而设计的。
我个人使用 screen 是因为我熟悉它,而且由于您所说的原因,我总是通过 ssh 使用 screen 会话,即我启动 screen,然后 verver 退出 screen 会话。通常我会有多个 screen 会话,例如主机上的每个 VM 一个。
- 使用 VNC 服务器。您可以通过 ssh(VNC-over-SSH)运行会话,或者使用速度更快、更安全的 FreeNX。请勿在没有 SSH 或 FREENX 的情况下通过“互联网”运行 VNC 服务器
通过 SSH 进行 VNC -https://www.cyberciti.biz/tips/tunneling-vnc-connections-over-ssh-howto.html
FreeNX-https://www.howtoforge.com/tutorial/freenx-ubuntu-14-04-trusty-tahr/
- 您可以使用 Xpra
https://help.ubuntu.com/community/Xpra
使用 xpra 您可以启动然后重新连接图形终端,但同样,您必须在启动终端之前运行 xpra。