我正在使用Ubuntu 22.04.1
(WSL 2
尽管它只Unix
与这个问题相关)
为什么当我们tmux
从zsh
会话运行时,进程树(我已经有所删节)从
init(Ubuntu)─┬─SessionLeader───Relay(9)─┬─ssh-agent
└─zsh───pstree
到
init(Ubuntu)─┬─SessionLeader───Relay(9)─┬─ssh-agent
├─tmux: server───zsh───pstree
└─zsh───tmux: client
在这里,pstree
只是告诉我进程树的命令,因此它在上面。
当我们运行tmux
in时zsh
,发生的事情是zsh
运行以创建一个 fork 进程,该进程是(即上面)fork()
的子进程。我不确定一个与生成它的进程同级的进程是如何形成的。zsh
tmux: client
tmux: server
对于服务器,
tmux
fork 自身两次以守护自身,为启动它的会话分离自身。孩子死了,孙子跑服务器。这意味着服务器没有父级。
没有父进程的进程通常由
init
ID 为 1 的进程收养。在 Linux 上,可以使用 将某些进程指定为子 subreaperPR_SET_CHILD_SUBREAPER
prctl()
,为其后代承担该角色。您在这里观察到的可能就是 WSL 的那个或等效项。该
Relay(9)
进程可能是一个子 subreaper,并采用了该tmux
服务器守护进程。您可以通过以下方式判断谁是您祖先中的子收割者:
我希望它返回进程的 pid
Relay(9)
。您可以
tmux
通过在以下位置运行它来遵循此处的操作:然后检查文件的内容
log
。你会看到类似的东西:父母是客户。
为服务器分叉两次。
孩子终止。
孙子(那时已经失去了上面的父母并被孩子 subreaper收养)运行服务器。
服务器分叉一个进程以
$SHELL
在第一个窗格中运行您的进程。