tmux 中的“窗格的第一个 pid”是什么意思?

tmux 中的“窗格的第一个 pid”是什么意思?

tmux 手册页中可用变量列表中的条目pane_pid如下:

pane_pid PID of first process in pane

然而,根据在正在运行的 tmux 会话中运行或向 tmux 窗格发送命令, “一旦使用初始命令启动了 tmux,它就不提供向窗格添加额外进程的方法。”

那么...返回 PID 是什么意思第一的窗格的过程?是否可以合理地假设这是独一无二窗格的 PID,或者实际上是否存在某种方法可以让窗格具有多个关联的 PID?

答案1

返回的PIDpane_pid一般是打开窗口时指定的命令的PID(或者没有指定命令时打开的shell)。

然而,需要注意的是,在指定类似 的命令时top; bash -i,tmux 会在命令前加上 前缀bash -c(即,创建窗格时执行的实际命令是bash -c top; bash -i)。在这种情况下,PID 是过程bash -c不是top

从某种意义上说,玻璃的“第一个工序”是仅有的一个窗格的进程,但它不一定是与指定命令直接关联的进程。

答案2

1)来自回答

非分体窗户只有一块玻璃

因此如果你启动一个新的 tmux 会话:

$ tmux

您将看到一个 shell,pane_pid = 该 shell 的 pid

因此如果你在 shell 中运行 htop 实用程序

$ htop

那么 pane_pid 也将是该 shell pid(第一个进程)

如果你在新窗口中运行 htop

Press (Prefix :)
: new-window 'htop'

pane_pid = htop 的 pid,如果你退出 htop,窗格也会关闭,但如果你使用 respawn 命令,如:

Press (Prefix :)  # for single pane window
: respawn-window -t session_name:window_index -k 'bash'
Or                # for multi-pane window  
: respawn-pane -t session_name:window_index.pane_index -k 'bash'

那么 pane_pid 将成为新进程的 pid(在本例中为 bash)


2)因此每个窗格都有一个 pane_pid,并且该 pane_pid 只能使用 respawn 进行更改


答案3

我认为您永远不能说窗格在技术上具有 PID。窗格中的进程具有 PID。窗格充当伪终端。您可以使用 top 实例启动窗格。它将运行,直到您关闭它,然后窗格将关闭(默认情况下,不知道此行为是否可以更改)。top 实例在运行时将具有关联的 PID。

编辑:开始新工作时,(例如:分割窗口 -h“顶部”)tmux 在新窗格中生成 top,top 的进程是 pane_pid。在新窗格中启动多个作业时(例如,分割窗口 -h“顶部;尾部 -F /var/log/maillog”),tmux 似乎生成了一个非交互式 shell 来控制作业。该 shell 显然获取了 pane_pid,而不是第一个进程(第二个示例中的“top”)。

按照设计,窗格仅在其中启动的初始进程运行时才会保持打开状态(尽管至少在理论上,内部进程可以在窗格关闭后作为僵尸进程存活下来)。当然,该进程可以产生新进程。所以我想您可以说窗格中有一个“神奇的进程”,如果被杀死,将导致窗格关闭,但窗格本身在技术上仍然没有 PID。这是有道理的,因为没有更多的输入或输出进入伪终端。

顺便说一句,这一切似乎都类似于正常的 Linux 终端行为。当您首次登录终端时,您将获得由登录进程生成的 bash(或您在用户文件中指定的其他 shell)进程。如果您同时登录 tty1 和 tty2,您将获得每个 shell。运行ps -u您可以看到正在运行的 shell 进程以及它在哪个终端上运行(tty1、tty2 等)。如果您在 tty2 中终止 shell 进程,您将从 tty2 中注销。但 tty2 保持打开状态,因为操作系统生成了一个 getty 来保持其打开状态。

相关内容