
Fundo:
- Conecte-se ao servidor Ubuntu via ssh
- Execute o tmux e desanexe
Por que o PPID do tmux é 1? Alguma informação sobre o mecanismo de tempo de execução do tmux?
Responder1
tmux
é executado em uma arquitetura cliente-servidor. Sempre que você executa tmux
a partir de um shell, você executa um cliente que é filho do shell. (É possível executar tmux
a partir de um não-shell, por exemplo, diretamente do sshd
, este detalhe não muda nada).
tmux
cliente tenta encontrar um tmux
servidor associado ao seu usuário. Se nenhum servidor for encontrado, às vezes o cliente irá reclamar (por exemplo, tmux attach-session
) e às vezes iniciará um servidor (por exemplo, sole tmux
, que é equivalente a tmux new-session
) e então fará seu trabalho.
A função de qualquer tmux
cliente é conversar com o servidor e fazer com que ele faça alguma coisa.
Quando tmux
precisa iniciar um servidor, ele faz clone(2)
sozinho. O processo filho resultante clone
s imediatamente e sai. O processo mais novo se torna o tmux
servidor real eseu PPID é 1 porque seu pai morreu. Parece que a única tarefa do processo intermediário é “desconectar” o servidor de seus ancestrais.
Acho que pode funcionar com tmux
o servidor sendo filho imediato de algum tmux
cliente e ganhando PPID de 1 somente depois que o cliente morrer. Observe que o objetivo tmux
é ter um servidor que continue funcionando após o cliente original ser desconectado; portanto, se o servidor fosse filho de algum cliente, provavelmente ficaria órfão, mais cedo ou mais tarde. E como em geral tmux
o cliente pode ser executado a partir de qualquer shell ou outro processo, que pode tentar monitorar os filhos de seus filhos, enviar sinais para eles, etc., deixar o servidor órfão o mais rápido possível é uma coisa razoável a se fazer.
Portanto, o servidor obtém PPID 1 quase imediatamente. Cada shell ou outro processo executado tmux
é descendente do servidor. Depois de (re)anexar, você verá o que o cliente lhe mostra. O próprio cliente é filho do shell em que você o invocou (ou sshd
qualquer outro). Ele conversa com o servidor, passa as teclas para ele, recebe informações sobre a aparência da janela e imprime os caracteres de acordo.
O servidor, uma vez iniciado, é executado até que todas as sessões sejam encerradas. Isso significa que, para encerrá-lo normalmente, você precisa encerrar todos os shells (ou outros processos) que são painéis.
Esta arquitetura explica porque o ambiente do primeiro invocado tmux
pode ser preservado, mas em geral o ambiente dos tmux
clientes pode não importar. O servidor começa como neto do primeiro tmux
, portanto pode herdar o ambiente. Depois disso tudo depende do servidor. Enquanto o servidor estiver em execução, não haverá herança direta de nenhum cliente posterior porque nem o servidor nem os processos recém-gerados (painéis) são descendentes desse cliente. Veressa minha resposta.