
Fondo:
- Conéctese al servidor Ubuntu a través de ssh
- Ejecute tmux y separe
¿Por qué el PPID de tmux es 1? ¿Alguna información sobre el mecanismo de tiempo de ejecución de tmux?
Respuesta1
tmux
se ejecuta en una arquitectura cliente-servidor. Siempre que ejecuta tmux
desde un shell, ejecuta un cliente que es hijo del shell. (Es posible ejecutar tmux
desde un shell, por ejemplo, directamente desde sshd
, este detalle no cambia nada).
tmux
El cliente intenta encontrar un tmux
servidor asociado a su usuario. Si no se puede encontrar ningún servidor, a veces el cliente se quejará (p. ej. tmux attach-session
) y otras iniciará un servidor (p. ej. sole tmux
, que es equivalente a tmux new-session
) y luego hará su trabajo.
El trabajo de cualquier tmux
cliente es hablar con el servidor y hacer que el servidor haga algo.
Cuando tmux
necesita iniciar un servidor, lo hace clone(2)
solo. El proceso hijo resultante clone
vuelve a funcionar inmediatamente y luego sale. El proceso más nuevo se convierte en el tmux
servidor real ysu PPID es 1 porque su padre ha muerto. Parece que el único trabajo del proceso intermedio es "separar" el servidor de sus antecesores.
Creo que podría funcionar si tmux
el servidor es hijo inmediato de algún tmux
cliente y luego obtiene un PPID de 1 solo después de que el cliente muere. Tenga en cuenta que el objetivo tmux
es tener un servidor que siga ejecutándose después de desconectar el cliente original; por lo tanto, si el servidor era hijo de algún cliente, lo más probable es que, tarde o temprano, quedara huérfano de todos modos. Y debido a que, en general, tmux
el cliente se puede ejecutar desde cualquier shell u otro proceso, que puede intentar monitorear a los hijos de sus hijos, enviarles señales, etc., dejar huérfano el servidor lo antes posible es algo razonable.
Entonces el servidor obtiene un PPID de 1 casi de inmediato. Cada shell u otro proceso que ejecuta tmux
es descendiente del servidor. Después de (volver) a adjuntar, verá lo que le muestra el cliente. El cliente en sí es hijo del shell en el que lo invocó (o sshd
lo que sea). Habla con el servidor, le pasa pulsaciones de teclas, recibe información sobre cómo debería verse la ventana e imprime los caracteres en consecuencia.
El servidor, una vez iniciado, se ejecuta hasta que se finalizan todas las sesiones internas. Esto significa que para finalizarlo correctamente, debe finalizar todos los shells (u otros procesos) que sean paneles.
Esta arquitectura explica por qué el entorno del primer invocado tmux
puede conservarse pero, en general, el entorno de tmux
los clientes puede no importar. El servidor comienza como nieto del primero tmux
, por lo que puede heredar el entorno. Después de esto todo depende del servidor. Mientras el servidor se ejecute, no hay herencia directa de ningún cliente posterior porque ni el servidor ni los procesos (paneles) recién generados son descendientes de este cliente. Veresta respuesta mía.