有没有办法将使用 & 从终端启动的进程重新连接到特定终端?例如,我通过以下方式启动 Kate:
kate &
现在我想将该进程重新附加到给定的终端。
答案1
这里有两个问题:
1) 因HUP导致死亡并避免:
如果您在 shell 中启动程序,然后结束该 shell,则所有子进程都将被终止。这包括在后台运行的程序。(那些在命令末尾以 & 开头的程序,如kate &
示例中的,还有您使用controlz和暂停的进程bg
)。
一旦关闭外壳,两者都会死亡。*1
您可以通过启动后台程序来解决这个问题disown
。它将继续运行,但您无法再将其返回到 shell 的前台。
您可以使用 nohup(例如nohup kate &
)将程序的输出保存在文件中。但完全重新连接到 shell 也不再可能。
2)终端仿真器。
您还可以启动一个程序,该程序本身模拟终端,并且是专门构建的,以便您可以重新连接到它。screen
和tmux
就是两个例子。
屏幕使用示例:
- 登录或 ssh 到主机。
screen
(启动屏幕。默认情况下,这将启动一个新的 shell)。kate
(凯特开始)。- ControlAD(分离屏幕,您将返回到第一次登录时所看到的相同提示。)
logout
走到另一台计算机,或者几个小时后回来。(或两者:)) - 登录或 ssh 到主机。 - screen -r
(重新连接屏幕。您现在回到运行 Kate 的 shell。
屏幕的有用命令:
screen -d
从屏幕程序外部分离屏幕。
使用 ControlAD从屏幕内部分离。
screen -r 重新连接到屏幕(例如从不同的位置)
screen -dr
如果有连接的屏幕,则先将其卸下。然后在本地连接。如果
您忘记在办公室卸下它并从家里登录,则很有用 ;)
screen -x
附加到正在运行的屏幕而不关闭其他会话。对于共享调试、帮助会话等很有用。
*1:编辑:当我回答这个问题时,我假设所有 shell 都会向其所有子进程发送 sigHUP。然而,这是一个选项,并且根据 shell 的不同,它可能可以被配置。在某些情况下,它甚至不再是默认的。
示例 1:在 bash 中,你可以通过 buildin 命令配置此选项购物。 (shopt -s huponexit
)。
示例 2:使用 zsh 你想要setopt
HUP
。
答案2
fg
将某些内容从当前终端的背景移到前台。