为什么 tmux 的 PPID 在 Ubuntu 上是 1?

为什么 tmux 的 PPID 在 Ubuntu 上是 1?

背景:

  • 通过 ssh 连接到 Ubuntu 服务器
  • 运行 tmux 并分离

为什么 tmux 的 PPID 是 1?有关于 tmux 运行时机制的信息吗?

答案1

tmux在客户端-服务器架构中运行。每当您tmux从 shell 运行时,您都会运行作为 shell 子级的客户端。(可以tmux从非 shell 运行,例如直接从 运行sshd,此细节不会改变任何内容)。

tmux客户端尝试查找tmux与您的用户关联的服务器。如果找不到服务器,有时客户端会发出抱怨(例如tmux attach-session),有时它会启动一个服务器(例如 sole tmux,相当于tmux new-session),然后执行其工作。

任何客户端的工作tmux都是与服务器对话并让服务器执行某些操作。

tmux需要启动服务器时,它会clone(2)自行启动。生成的子进程会立即clone再次启动,然后退出。最新的进程将成为实际的tmux服务器,并且它的 PPID 为 1,因为它的父代已经去世看起来中间进程的唯一工作就是将服务器与其祖先“分离”。

我认为,tmux如果服务器是某个客户端的直接子进程tmux,那么只有在客户端终止后才获得 PPID 1,那么它可能可以正常工作。请注意,这样做的目的tmux是让服务器在原始客户端断开连接后继续运行;因此,如果服务器是某个客户端的子进程,那么它迟早都会成为孤儿进程。而且,由于tmux客户端通常可以从任何 shell 或其他进程运行,这些进程可能会尝试监视其子进程的子进程,向它们发送信号等,因此尽快使服务器成为孤儿进程是合理的做法。

因此服务器几乎立即获得 PPID 1。您在其中运行的每个 shell 或其他进程tmux都是服务器的后代。在您(重新)连接后,您会看到客户端向您显示的内容。客户端本身是您在其中调用它的 shell 的子级(或sshd其他)。它与服务器通信,将击键传递给它,接收有关窗口应如何显示的信息并相应地打印字符。

服务器一旦启动,就会一直运行,直到其中的所有会话都被终止。这意味着,为了正常终止它,您需要终止所有正在运行的 shell(或其他进程)。

这种架构解释了为什么可以保留第一个调用的环境tmux,但一般来说tmux客户端的环境可能并不重要。服务器作为第一个调用的孙子启动tmux,因此它可以继承环境。此后一切都取决于服务器。只要服务器运行,就不会从任何后续客户端直接继承,因为服务器和新生成的进程(窗格)都不是此客户端的后代。参见我的这个答案

相关内容