vi
我在终端中打开了一个正在运行的文件( xterm
),如果我直接关闭终端而不先关闭文件,那么我可以看到它vi
仍在后台运行(ps x
)。现在有没有办法将该进程(即 vi )附加到其他终端,以便我可以继续处理该文件。我也尝试过fd
命令,但失败了。
答案1
这不可能“干净利落地”实现。有以下工具:屏幕和tmux创建一个剩余虚拟终端:您可以在屏幕内启动程序,分离屏幕会话,然后在不同的终端上重新连接屏幕会话。但这需要提前规划。
可以使用跟踪摆弄进程的文件描述符以将它们重新连接到另一个终端。这种方法并不可靠,因为它可能会在进程的数据结构中造成不一致:有些程序不会介意,而其他程序会崩溃。您可以通过将程序附加到调试器中并发出正确的系统调用序列(至少open
,dup
以及close
每个标准输入、标准输出和标准错误)来做到这一点。有几种现有的工具可以做到这一点,例如内尔克和雷蒂。
也可以看看我如何通过 ssh 暂停正在运行的进程、放弃它、将其关联到新的屏幕 shell 并取消暂停?,通过 SSH 查看脚本?,我可以 nohup/screen 一个已经启动的进程吗?,在断开的 SSH 会话中恢复运行的命令。
答案2
你可以试试GNU 屏幕.它就是为此目的而制造的。
Screen 是一个全屏窗口管理器,它在多个进程(通常是交互式 shell)之间多路复用一个物理终端
答案3
您可以使用 GDB 将正在运行的进程附加到终端。
以下是对一个问题的多个答案的描述(特别是参见 Mirek 的答案):
答案4
没有办法。只需终止分离的进程即可。如果您有意这样做,请查看“screen”命令。但是,如果您的底层 shell 死机,这将无法挽救您。