Estou usando Ubuntu 22.04.1
on WSL 2
(embora o fato de ser Unix
relevante apenas para esta pergunta)
Como é que, quando executamos tmux
uma zsh
sessão, a árvore de processos (que eu resumi um pouco) muda de
init(Ubuntu)─┬─SessionLeader───Relay(9)─┬─ssh-agent
└─zsh───pstree
para
init(Ubuntu)─┬─SessionLeader───Relay(9)─┬─ssh-agent
├─tmux: server───zsh───pstree
└─zsh───tmux: client
Aqui, pstree
é apenas o comando que me informa a árvore do processo, daí sua presença acima.
Quando rodamos tmux
em zsh
, o que acontece é que zsh
roda fork()
para criar um processo fork que é filho de zsh
(ou seja, tmux: client
acima). Não tenho certeza de como tmux: server
, um processo que é irmão do processo que o gerou, surge.
Para o servidor,
tmux
bifurca-se duas vezes para se daemonizar, desconectar-se da sessão da qual foi iniciado.A criança morre, o neto comanda o servidor. Isso significa que o servidor não tem pai.
Processos sem pais são normalmente adotados por
init
, o processo de id 1. No Linux, algum processo pode ser nomeado subceifeiro filho usando oPR_SET_CHILD_SUBREAPER
prctl()
para assumir esse papel para seus descendentes.Isso ou o equivalente para WSL é provavelmente o que você está observando aqui. Esse
Relay(9)
processo é provavelmente um subceifeiro filho e adotou essetmux
daemon de servidor.Você pode dizer quem é a criança subceifadora em sua ancestralidade com algo como:
Eu esperaria que retornasse o pid do
Relay(9)
processo.Você pode seguir o que
tmux
faz aqui executando-o em:E inspecione o conteúdo do
log
arquivo depois. Você verá algo como:O pai é o cliente.
Forked duas vezes para o servidor.
Criança termina.
O neto (que nessa época já perdeu seu pai acima e foi adotado pelo subceifador filho ) executa o servidor.
O servidor bifurca um processo para executar o seu
$SHELL
no primeiro painel.