我目前正在使用 SSH 客户端连接我的实验室正在使用的服务器。我对“后台运行的会话”的概念有疑问。我查看了这个社区的一个问题(什么是后台进程?)但我觉得这与我想知道的有点不同。
我们正在使用的服务器(我不确定是服务器还是互联网连接)遇到了一些问题,例如当我们让进程运行过夜并在早上来时,shell 会话会断开连接。
有人建议的一种解决方案是使用该程序多路复用器来规避这个问题。该程序声称要做的是分离会话,这样即使服务器断开连接,我们的进程也不会受到干扰。
我只是想知道,像这样的“在后台运行”的进程究竟意味着什么?这与我上面链接的问题相同吗?我只是没有正确理解它吗?另外,“附加或分离”会话是什么意思?
我想我的困惑来自于我不明白当 shell 断开连接时会话如何运行。
谢谢!
答案1
你对这个概念有困难,因为不存在这样的概念。 进程组可以在后台/前台。该概念不适用于会议,既不是操作系统所谓的会话,也不是所谓的tmux
会话,这是两个截然不同的东西。
所做tmux
的就是创建一个或多个伪终端,其中运行的程序tmux
将其视为控制终端(以及标准输入、输出和错误)。它多路复用这些内部端子到一个单一的外终端,这将是当您通过 SSH 登录时,SSH 服务器在您的计算机上设置的伪终端。
那里有两个tmux
进程,一个是长寿命的服务器连接到所有这些内部伪终端的后端(即“主”侧,使用不再流行的术语),以及客户它是该服务器和所实现的外部终端之间的中介。实际上,可以有多个客户端,但我们可以在这里掩盖这种复杂性,因为它不会改变要点。
这服务器只要至少有一个内部伪终端剩余,进程就存在。它将伪终端分组为集合,这就是tmux
的会议。不要将其与操作系统所称的会话(进程组和可选的控制终端的集合)或会话混淆。会议通过 SSH(远程 SSH 服务器和本地 SSH 客户端之间)。 “会话”可以表示很多不同的东西。请注意,我tmux
在这里用“”、“SSH”和“操作系统”对其进行了不同的限定。
这客户过程是短暂的,然后就会消失——分离来自tmux
会话和服务器 — SSH 连接丢失。当您使用 SSH 重新登录时,您将创建一个新的客户认为重新连接到tmux
服务器(由其管理的会话),并且新客户端实现了服务器的用户界面tmux
- 所有视窗在tmux
会话和状态行中 — 进入新的伪终端以进行新的 SSH 登录会话。客户端tmux
一次实现一个会话,即它当前所连接的会话。
客户端进程是操作系统所谓会话的一部分,该会话由操作系统控制外由 SSH 服务器创建的用于 SSH 登录的伪终端。它受操作系统会话的生命周期的影响,而操作系统会话的生命周期又受 SSH 会话的生命周期的影响,并且可以位于后台或前台进程组中该外部航站楼的。它(因此)受到shell作业控制该 SSH 会话的登录 shell 的名称。
服务器进程完全脱离外部终端及其操作系统会话。它不受他们的寿命限制。这是不在他们的后台或前台进程组。它的寿命完全取决于内终端,其 I/O 为tmux
客户端提供服务。
有内和外终端。有随附的和超然的 tmux
会话,通过连接到服务器和从tmux
服务器分离的客户端进行扩展。有积极的和不活跃的会话中的窗口tmux
。 shell 作业控制的概念背景和前景不参与。
答案2
Unix 进程可以通过两种主要方式被称为“在后台运行”:
仍然由另一个进程(如 shell)作为父进程。如果您
&
在 Bourne shell 中使用该运算符,将会发生以下情况:sleep 10 &
该
sleep
进程将由 shell 在后台运行,因此它将继续运行,但您可以与 shell 提示符交互并运行其他命令。如果像这样在后台运行的程序尝试读取任何输入,它将被信号停止SIGTTIN
。然而,重要的是,它仍然属于它启动的 shell 进程,并且仍然连接到 tty(它运行的终端),并且如果 tty 关闭(ssh 连接断开并且 shell 退出),则进程将被杀死
SIGHUP
。这称为 shell 作业控制 - 进程可以使用
&
或bg
或^Z
放在后台,然后使用fg
和 列出,jobs
等等。它的真正目的是在您处理另一个命令时暂时将一个命令置于后台,而不是用于需要安全防止 shell 退出和终端消失的长时间运行的进程。一个守护进程。这是一个完全脱离父进程及其 tty 的进程。它有一个新的进程组和会话 ID,其父进程是 PID 1(通常
init
,尽管在现代 Linux 上我相信systemd
已经接管了该角色)。由于守护进程不以 shell 为父进程,并且不附加到 tty,因此当 shell 退出或 tty 关闭时,它不会被终止。它必须由系统或用户显式终止。大多数 Unix 系统都带有许多默认守护进程来执行各种操作。
这是一个广泛的解释,还有很多关于 shell 作业控制和守护进程的细节我没有提到。
有一个名为的程序nohup
可以使程序以 (1) 忽略该SIGHUP
信号运行,这样当 tty 关闭时它就不会退出。这并不使它成为真正的守护进程,但对于仅输出而不需要任何输入的简单作业很有用。
tmux 是一个作为守护进程运行的程序,但允许您在其中运行其他程序(shell 或其他任何程序)。 tmux 比nohup
您可以运行全屏程序以及需要输入和输出的程序复杂得多。因为它是一个守护进程,所以当 tty 消失时(例如当 ssh 连接断开时),它不会被杀死。
在 tmux 中,“附加”意味着 tmux 在终端上显示一个或多个在其中运行的进程。您可以从该终端“分离”tmux,然后再次将其“附加”到另一个终端。如果 ssh 连接断开或被终止,分离会自动发生。因此,您可以关闭终端和 ssh,然后从不同的终端连接并附加 tmux,一切都保持原样。