Resumen : estoy tratando de averiguar por qué mi sesión tmux muere cuando me desconecto de ssh
Detalles :
Tengo tmux instalado en un sistema Arch Linux. Cuando comienzo una sesión de tmux, puedo desconectarme y luego volver a adjuntarla mientras la sesión ssh está activa. Pero si termino mi sesión ssh, entonces la sesión tmux se mata.
Sé que este no es el comportamiento normal porque tengo otro sistema donde la sesión tmux continúa ejecutándose incluso si la sesión ssh finaliza y puedo conectarme a la sesión tmux después de establecer una nueva conexión ssh. El sistema que tiene un problema y el que funciona correctamente tiene configuraciones muy similares, por lo que no estoy seguro de qué verificar.
Estoy ejecutando tmux versión 1.9a. El sistema que tiene un problema (para el que tengo acceso de root) tiene una versión de kernel de Linux de 3.17.4-1 y el sistema que funciona correctamente tiene la versión de kernel 3.16.4-1-ARCH (no tengo root en eso sistema). Sin embargo, dudo que la versión del kernel sea la fuente del problema, esa es solo una diferencia que noté.
Pensé en preguntar si alguien ha visto un problema similar y sabe de una posible solución.
Los pasos precisos que conducen al problema son:
- ssh a la máquina
- corre
tmux
para iniciar tmux ctrl-B D
para separar (en este punto podría volver a conectar contmux attach
- cierre la sesión ssh (en este punto se cancela la sesión tmux, pude observar esto cuando inicié sesión como root en un terminal diferente)
tmux attach
me vuelvo a conectar con ssh y ejecuto y recibo el mensajeno sessions
ytmux ls
devuelve ejecutandofailed to connect to server: Connection refused
. Esto tiene sentido porque el servicio no se está ejecutando. Lo que no tiene sentido para mí es por qué se mata en el paso 4 cuando me desconecto de la sesión ssh.
datos de strace:
En respuesta a uno de los comentarios, utilicé strace para ver qué llamadas de sistemas realiza el proceso del servidor tmux. Parece que cuando salgo de mi sesión ssh (escribiendo exit
o con ctrl-d
) que el proceso tmux está siendo eliminado. Aquí hay un fragmento de la parte final de la salida de strace.
poll([{fd=4, events=POLLIN}, {fd=11, events=POLLIN}, {fd=6, events=POLLIN}], 3, 424) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} ---
sendto(3, "\17", 1, 0, NULL, 0) = 1
+++ killed by SIGKILL +++
Comparé esto con un sistema diferente donde tmux funciona correctamente y en ese sistema el proceso tmux continúa ejecutándose incluso después de salir. Entonces, la causa raíz parece ser que el proceso tmux está finalizando cuando cierro la sesión ssh. Tendré que pasar un tiempo resolviendo esto para entender por qué, pero pensé que actualizaría mi pregunta ya que la sugerencia de strace fue útil.
Respuestas:
Teoría
Algunos sistemas init, incluido systemd, proporcionan una función para eliminar todos los procesos que pertenecen al servicio. El servicio generalmente inicia un proceso único que crea más procesos mediante bifurcación y esos procesos también pueden hacerlo. Todos estos procesos generalmente se consideran parte del servicio. En systemd esto se hace usando cgroups .
En systemd, todos los procesos que pertenecen a un servicio se eliminan cuando el servicio se detiene por defecto. El servidor SSH es obviamente parte del servicio. Cuando se conecta al servidor, el servidor SSH generalmente se bifurca y el nuevo proceso maneja su sesión SSH. Al bifurcar desde el proceso de sesión SSH o sus hijos, se inician otros procesos del lado del servidor, incluida su pantalla o tmux .
Killmode y activación de socket
El comportamiento predeterminado se puede cambiar usando la
KillMode
directiva. El proyecto ascendente AFAIK no incluye ningún.service
archivo, por lo que varían según la distribución. Por lo general, hay dos formas de habilitar SSH en su sistema. Uno es el clásicossh.service
que mantiene un demonio SSH de larga duración escuchando en la red. El otro es a través de la activación de socket manejada por elssh.socket
que a su vez comienza,[email protected]
que solo se ejecuta para una sola sesión SSH.Soluciones
Si sus procesos se anulan al final de la sesión, es posible que esté utilizando la activación de socket y systemd lo anula cuando se da cuenta de que el proceso de sesión SSH salió. En ese caso hay dos soluciones. Una es evitar el uso de la activación del socket mediante el uso de en
ssh.service
lugar dessh.socket
. El otro es establecerKillMode=process
en laService
sección de[email protected]
.La
KillMode=process
configuración también puede ser útil con el clásicossh.service
, ya que evita matar el proceso de sesión SSH o la pantalla o los procesos tmux cuando el servidor se detiene o se reinicia.Notas futuras
Esta respuesta aparentemente ganó un nivel de popularidad. Si bien funcionó para el OP, puede suceder que no funcione para alguien en el futuro debido al desarrollo o configuración de systemd-logind . Consulte la documentación sobre las sesiones de inicio de sesión si experimenta un comportamiento diferente de la descripción en esta respuesta.
fuente
init
lugar desystemd
. Pero es un poco diferente de todos modos, vea mi pregunta .¿Utiliza systemd con activación de socket para SSH?
Si es así, hay un problema conocido con eso . Según los defensores de systemd, esta es realmente una característica: systemd mata todos los procesos generados por una sesión cuando la sesión finaliza. (Puedo ver que es útil, pero en GNU
screen
, otmux
, en el caso, definitivamente no quieres eso ☺ ni en la mayoría de los otros casos en los que los usuarios pueden ejecutar procesos en segundo plano, por supuesto).Si es así, intente cambiar de
sshd.socket
asshd.service
.fuente
Estaba teniendo el mismo problema con tmux y screen en Ubuntu 16.04 (kde neon). Cuando se desconectó la sesión ssh, se finalizó screen / tmux.
Para resumir, systemd cambió su configuración predeterminada a killuserprocess = yes, así que después de salir de una sesión ssh, todos los procesos creados por él finalizarán.
Solución fácil (después de horas de intentarlo) ejecute screen / tmux usando este comando
Para la pantalla
systemd-run --scope --user screen
para Tmux
systemd-run --scope --user tmux
Puedes crear un alias para hacerlo más fácil
alias tmux= "systemd-run --scope --user tmux"
fuente
-bash: systemd-run: command not found
enRed Hat Enterprise Linux Server release 6.8 (Santiago)
.Otra solución a esto, que no requiere pasar de
sshd.socket
asshd.service
, es iniciar eltmux
servidor como un servicio systemd [0]. De esta manera, eltmux
servidor ya se está ejecutando cuando ingresa SSH en el servidor, en lugar de engendrado por eltmux
comando en SSH, por lo tanto, no se eliminará.[0] https://wiki.archlinux.org/index.php/tmux#Autostart_with_systemd
fuente
La mejor respuesta que he encontrado, IMO, se da en Prevent Logoff from Killing tmux Session :
Esta "característica" ya existía
systemd
anteriormente, pero lossystemd
desarrolladores decidieron efectuar un cambio en el valor predeterminado , para permitir la configuración de la finalización de procesos secundarios al cerrar sesión en una sesión.Puede revertir esta configuración en su
logind.conf
(/etc/systemd/logind.conf
):fuente