Bash 进程 - 重新附加进程在后台启动

Mau*_*ren 10 linux bash process

有没有办法将使用 & 从终端启动的进程重新附加到特定终端?例如,我通过以下方式开始了 Kate:

kate &
Run Code Online (Sandbox Code Playgroud)

现在我想将进程重新附加到给定的终端。

Sli*_*ban 21

fg 在当前终端中将某些东西从后台带到前台。


Hen*_*nes 9

这里有两个问题:

1) 被 HUP 杀死并避免:

如果您在 shell 中启动程序然后结束该 shell,则所有子进程都将被终止。这包括运行到后台的程序。(在命令末尾以 & 开头的那些,如kate &您的示例中的 ,但也包括您暂停的进程,controlz然后bg)。

一旦关闭外壳,两者都会死亡。*1

您可以通过运行disown后台程序来解决此问题。然后它会继续运行,但你不能再让它回到 shell 的前台。

您可以使用 nohup(例如nohup kate &)将程序的输出保存在文件中。但是完全重新连接到外壳也不再可能。


2)终端模拟器。

您还可以启动一个程序来模拟自己的终端,该程序是专门构建的,因此您可以重新连接到它。screen并且tmux是这方面的两个例子。

屏幕使用示例:

  • 登录或 ssh 到主机。
  • screen (启动屏幕。默认情况下,这会启动一个新的外壳)。
  • kate (凯特开始)。
  • ControlAD (分离屏幕,您将返回与您第一次登录时相同的提示。)。
  • logout

走到另一台电脑前,或者几个小时后再回来。(或两者都:)) - 登录或 ssh 到主机。- screen -r (重新附加屏幕。您现在回到正在运行 kate 的 shell。

有用的屏幕命令:

screen -d
从屏幕程序外部分离屏幕。
使用 ControlAD从屏幕内部分离。

screen -r 重新连接到屏幕(例如从不同的位置)

screen -dr
如果有附加的屏幕,则首先将其分离。然后将其附加到本地。
有用,你忘了在办公室把它拆下来,然后从家里登录;)

screen -x
附加到正在运行的屏幕而不关闭其他会话。用于共享调试、帮助会话等。


*1:编辑:当我回答这个问题时,我假设所有的 shell 都会向它的所有子进程发送一个 sigHUP。然而,这是一个选项,根据外壳,它可能是可配置的。在某些情况下,它甚至不再是默认设置。

示例 1:在 bash 中,您可以通过内置命令shopt配置此选项。( shopt -s huponexit).

示例 2:使用 zsh 你想要.setoptHUP

  • 这就是你首先启动`screen`的原因。然后,您可以启动该程序(不使用`&` 将其作为背景。您可以使用 control-AD 分离(有点关闭)屏幕,程序将继续运行。第二天早上您可以登录并使用 `screen - r` 重新连接,您将回到程序。您甚至可以从家里登录(例如通过 SSH)并重新连接屏幕。 (9认同)