34 votos

Curriculum vitae de comandos que se ejecutan en caer sesión de SSH

La lectura de esta pregunta me puso a pensar. Asumiendo screen no está siendo utilizado. Si una sesión de SSH en Linux destino se ha caído, por la razón que sea, y que usted vuelva a conectar antes de que el servidor mata a la sesión, porque de tiempo de espera, es posible recuperar el control de la ejecución de comandos de tal manera que no se interrumpa la causa de la sesión interrumpida?

13voto

dannysauer Puntos 559

Intentar conectar un nuevo terminal de la enfermedad de transmisión SEXUAL actual* descriptores de archivo a un viejo proceso en ejecución es simplemente buscar problemas. Incluso si se las arreglan para hacer que el terminal de control de trabajo no funciona como se esperaba. Tendrás un lío a la izquierda detrás de si, finalmente, la salida a los más de programa, y lo que sucede a la shell que ha sacrificado su descriptores de archivo para ser entregado a la recién en segundo plano el proceso. Se ssh mantendrá abierta mientras que shell se va? Probablemente no. Así que usted necesitará para redirigir es un lugar.

Posible o no, yo apuesto a que es más conveniente dejar abandonado el proceso de morir "naturalmente". Si estás haciendo algo lo suficientemente importante como para justificar tratando de hacer todos los trucos necesarios para reanudar el control y estás en un inestable enlace, usted probablemente sabe que de antemano y sólo el uso de la pantalla (o vnc, o cualquier cosa que flote sus separado de control de barco). :)

4voto

quack quixote Puntos 1060

En general, la forma correcta de manejar este es preparar de antemano, utilizando GNU screen o de bash nohup o disown mecanismos. Si usted está usando tcsh, el shell va a renegar de los trabajos en segundo plano cuando se cierra de forma anormal.

Si usted no está usando screen , pero han logrado mantener su proceso de ejecución a través de uno de los renegar de los métodos, usted puede ser capaz de falsos volver a conectar con el proceso de con gdb (fuente):

[...] con algunas sucio hacks, no es imposible volver a abrir un proceso de' stdout/stderr/stdin. [...]

Y, a continuación, utilizar gdb, por ejemplo, a adjuntar al proceso, hacer un poco de llamar a close(0)
llamar a close(1)
llamar a close(2)
la llamada open("/dev/pts/xx", ...)
llame dup(0)
llame dup(0)
separar

Ahora, tendrías que modificar este proceso para que tu situación. Dudo que sería de gran ayuda si usted no ha podido ignorar el proceso. Si usted está usando bash, ver este post sobre la fabricación de bash automáticamente renegar de procesos en segundo plano en la salida (básicamente, apague huponexit con shopt). Con un proceso de primer plano, tienes que haber utilizado nohup.

1voto

Evan Broder Puntos 761

retty podría ser capaz de ayudar a usted, pero las renuncias son muy reales y relevantes :)

1voto

monomyth Puntos 841

Si la sesión se cayó, significa TTL ya está caducado, así que no hay más tty para usted (como yo lo entiendo). Pero, si la conexión de red se interrumpe, en su sesión de SSH, puede que no necesite ir hacia abajo, y usted debería ser capaz de reanudar su conexión y continuar. Es que lo que están pidiendo?

1voto

ColinYounger Puntos 2941

Probablemente no. No puedo garantizar que es imposible, pero realmente lo dudo.

Una cosa es la falta de la matanza de la concha y los posibles comandos que se ejecutan como consecuencia de la terminación de la conexión ssh. Esto no es tan difícil, usted debería ser capaz de utilizar nohup y mecanismos similares, como se mencionó en la otra pregunta.

Pero entonces, supongamos que comenzó ssh somehost nuhup vim /some/file y la conexión muere. Ejecutar ssh somehost iniciar sesión otra vez y puedo ver que su vim proceso aún está en marcha. Pero entonces, ¿cómo se puede conectar para que el proceso de nuevo? Interactivo primer plano los procesos de control de tty y la abrió para su vim proceso cuando comenzó sería desde entonces se han cerrado. No estoy seguro de si hay alguna manera de "reapertura" de nuevo en su nuevo shell (como si usted tiene varios antecedentes de trabajos que se ejecutan en una shell que no en primer plano cualquiera de ellos en otro shell).

Screen han sido explícitamente por escrito para tener esta funcionalidad. En el inicio se divide en dos procesos, un terminal de proceso de gestión y un proceso de cliente. La interacción es cliente <--> terminal manager <--> aplicación, y cuando se separe o se pierde la conexión, el cliente proceso muere, mientras que el gerente del terminal sigue vivo. La pantalla tiene algún apoyo específico para conectar a la terminal de proceso de gestión de nuevo más tarde, y no creo que esto es posible en el caso general.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: