¿Cómo me vuelvo a unir a una sesión de mosh separada?

157

¿Cómo me vuelvo a unir a una sesión separada de mosh o de lo contrario me deshago

Mosh: You have a detached Mosh session on this server (mosh [XXXX]).

es decir, ¿cuál es el equivalente mosh de

screen -D -R

o posiblemente

screen -wipe

Además, ¿dónde se puede encontrar esta respuesta en la documentación?

John Baber-Lucero
fuente

Respuestas:

197

Por razones de seguridad, no puede volver a conectarlo, consulte https://github.com/keithw/mosh/issues/394

Para eliminar la sesión separada, use el número PID que se muestra en ese mensaje (esa es la parte 'XXXX'). Por ejemplo, si ve:

Mosh: You have a detached Mosh session on this server (mosh [12345]).

Y puede ejecutar este comando:

kill 12345

Además, para cerrar todas las conexiones mosh puedes:

kill `pidof mosh-server`

Tenga en cuenta que si actualmente está conectado a través de mosh, este último comando también lo desconectará.

varta
fuente
34
@artfulrobot Porque existe la posibilidad de que la sesión separada pertenezca a un cliente mosh que todavía está vivo en algún lugar. Las sesiones de Mosh deambulan y pueden sobrevivir a través de un ciclo de suspensión / reanudación (por ejemplo, "Hibernación"). El problema que mosh no resuelve (y no puede resolver fácilmente) es detectar que la máquina cliente se reinició sin cerrar correctamente la sesión de mosh.
binki
77
¿Hay alguna razón para no killall mosh-serverhacerlo? Especialmente porque pidof y killall son realmente lo mismo de todos modos.
Jordania
66
@ Jordan: en algunos sistemas (Solaris, por ejemplo), killallhace exactamente lo que dice.
Pausado hasta nuevo aviso.
44
Si está conectado a través de Mosh y corre killall mosh-server, se desconectará.
0xcaff
1
@ 0xcaff si te conectas a través de Mosh y corres kill `pidof mosh-server`, serás separado de la misma manera
David
26

Para mi sorpresa, utilicé CRIU ( https://criu.org ) para verificar y reiniciar un cliente mosh y funcionó.

Impactante.

Encuentre el PID de su cliente mosh:

$ ps -ef | grep mosh

Luego, instale CRIU de acuerdo con sus instrucciones.

Luego, apúntalo así:

puesto de control $ mkdir

$ sudo ./criu dump -D punto de control -t PID --shell-job

Luego, restaurarlo:

$ sudo ./criu restore -D punto de control --shell-job

Y ahí está. Su cliente Mosh ha vuelto.

Una cosa a tener en cuenta, sin embargo, es que si su computadora portátil se reinicia (que es el objetivo de lo que estamos tratando de proteger), mosh usa un monotonic reloj para rastrear el tiempo en el lado del cliente, que no funciona en los reinicios. Sin embargo, esto NO funcionará, si su computadora portátil simplemente se bloquea, no funcionará porque los números de secuencia mosh no estarán sincronizados con la versión que se verificó (el binario se reanudará, pero la comunicación se detendrá).

Para solucionar esto, debe decirle a mosh que deje de hacerlo y descargue el código fuente de mosh. Luego, edite este archivo:

cd mosh

vim configure.ac

Luego, busque GETTIMEy comente esa línea.

Entonces hazlo:

autoreconf # o ./autogen.sh si acaba de clonarlo por primera vez

./configure

hacer

hacer instalar

Después de eso, sus sesiones de cliente mosh con CRIU verificadas sobrevivirán a los reinicios.

(Obviamente, necesitaría escribir algo para realizar los puntos de control con la suficiente regularidad como para ser útil. Pero, eso es un ejercicio para el lector).

Michael Galaxy
fuente
1
Asegúrese de escribir 'CTRL-L' para actualizar la salida de la pantalla después de la restauración.
Michael Galaxy
66
Por pura curiosidad, ¿hay algún beneficio práctico de restaurar la sesión de cliente Mosh que me estoy perdiendo? Ejecuto tmux en mosh y solo puedo relanzar mosh en el cliente y volver a conectar el tmux ... ¿hay alguna ventaja de hacer esto además de su genialidad (que realmente es!)?
eskhool
1
La respuesta larga: github.com/mobile-shell/mosh/issues/394 La respuesta corta es sí: uno no debería necesitar una sesión tmux si el demonio mosh-server ya se está ejecutando en el servidor de destino. No solo deja a los demonios mosh colgando, sino que es otro conjunto de teclas que no deberíamos tener que escribir en primer lugar.
Michael Galaxy
1
Mosh es un sustituto (en algunos casos) de SSH, no de pantalla. quoth keithw (autor mosh) en github
törzsmókus
19

Me doy cuenta de que esta es una publicación antigua, pero hay una solución muy simple para esto, como lo sugiere Keith Winstein, autor de mosh, aquí: https://github.com/mobile-shell/mosh/issues/394

"Bueno, en primer lugar, si desea la capacidad de adjuntar a una sesión desde múltiples clientes (o después de que el cliente muere), debe usar screen o tmux. Mosh es un sustituto (en algunos casos) para SSH, no para screen. Muchos usuarios de Mosh lo usan junto con la pantalla y les gusta de esa manera ".

Escenario: estoy conectado a un servidor remoto a través de mosh. Luego ejecuté la pantalla y tengo un proceso ejecutándose en la sesión de pantalla, htop, por ejemplo. Pierdo la conexión (la batería del portátil se agota, pierdo la conexión de red, etc.). Me conecto de nuevo a través de mosh y recibo ese mensaje en el servidor,

Mosh: tiene una sesión Mosh separada en este servidor (mosh [XXXX]).

Todo lo que tengo que hacer es matar la sesión previa de mosh

matar a XXXX

y vuelva a conectar a la sesión de pantalla, que todavía existe .

pantalla -r

Ahora, htop (o cualquier proceso que se esté ejecutando) está de regreso tal como estaba sin interrupción. Esto es especialmente útil para ejecutar actualizaciones u otros procesos que dejarían al servidor en un estado desordenado y desconocido si se interrumpe repentinamente. Supongo que puedes hacer lo mismo con tmux, aunque no lo he probado. Creo que esto es lo que sugirieron Annihilannic y eskhool.

007
fuente
2
Esta es una respuesta genial. Gracias, y sí, he confirmado que funciona igual con tmux.
laughing_man
10

Como una adición a la respuesta de Varta, utilizo el siguiente comando para cerrar todas las conexiones mosh excepto la actual:

pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill

Alexander Burmak
fuente
En caso de que no haya una sesión de mosh antigua, xkill arrojará un error. Mejor usopgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
rubo77
4

Como señaló @varta, los propietarios de mosh están muy en contra de la reincorporación de diferentes clientes por razones de seguridad. Entonces, si su cliente se fue (por ejemplo, reinició su computadora portátil), su única opción es matar las sesiones.

Para matar solo sesiones separadas, puede usar la siguiente línea (que tengo como un alias en mi .bashrc).

who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill

Ese comando depende del hecho de que la wholista de usuarios conectados incluye sesiones mosh, solo las sesiones mosh adjuntas tienen "via mosh", y que las sesiones mosh tienen su pid entre corchetes. Por lo tanto, encuentra las imágenes solo para las sesiones de mosh separadas y las pasa para matar usando xargs.

Aquí hay un ejemplo de whoresultado para referencia:

$ who
theuser    pts/32       2018-01-03 08:39 (17X.XX.248.9 via mosh [193891])
theuser    pts/17       2018-01-03 08:31 (17X.XX.248.9 via mosh [187483])
theuser    pts/21       2018-01-02 18:52 (mosh [205286])
theuser    pts/44       2017-12-21 13:58 (:1001.0)

Una alternativa es utilizar la variable de entorno mosh-server MOSH_SERVER_SIGNAL_TMOUT. Usted puede configurarlo para que algo así como 300 en el .bashrcde la lado del servidor . Luego, si lo hace pkill -SIGUSER1 mosh-server, solo matará a los servidores mosh que no se hayan conectado en los últimos 300 segundos (los demás ignorarán el SIGUSER1). Más información en la página de manual de mosh-server . Estoy usando el comando anterior porque, una vez alias, me parece más simple.

Tenga en cuenta que, según lo mencionado por @Annihilannic, si está usando tmux / screen dentro de sus sesiones de mosh, esas sesiones de tmux / screen siguen vigentes después de matar las sesiones de mosh. Por lo tanto, aún puede apegarse a ellos (para que realmente no pierda mucho al matar las sesiones de mosh).

studgeek
fuente
3

Las respuestas aquí que afirman que matar mosh-serveres la única opción son en gran medida obsoletas, ya que podemos usar criuy reptyrrecuperar y volver a unir procesos arbitrarios.

Sin mencionar que hoy en día podemos kill -USR1 mosh-server matar sesiones separadas de una manera limpia y segura, sin recurrir a whosalidas inseguras o comandos engorrosos para evitar matar nuestra propia sesión.

Junto a la criurespuesta de Michael R. Hines, existe un poco más "ligero" reptyrque se puede utilizar para volver a unir los procesos iniciados por mosh-server(es decir, no el mosh-serverpropio). Yo suelo usar

pstree -p <mosh-server PID>

para enumerar el árbol de procesos en el servidor mosh separado, y luego

reptyr PID

para volver a conectar el proceso deseado a mi terminal actual. Después de repetir el procedimiento para todos los procesos que me interesan, yo

kill -USR1 <mosh-server PID>

mientras que me encargo de matar solo las sesiones que sé que son mías (sistema compartido).

Irritar
fuente
ObtengoUnable to attach to pid 10103: Permission denied
rubo77
-1

Use el comando ps para obtener la lista de tareas en ejecución o use ps -ef | grep mosh

Mata el PID mosh usando este comando:

kill <pid>

Además, para cerrar todas las conexiones mosh puedes:

Tenga en cuenta que si actualmente está conectado a través de mosh, esto también lo desconecta

kill `pidof mosh-server`
Pankaj Chauhan
fuente