¿Mi consulta MySQL continuará ejecutándose incluso si mi conexión ssh se cae?

16

Me conecté a un servidor a través de SSH e inicié sesión en mysql, y le pedí que ejecutara una consulta (cuyos resultados se vierten en un CSV) que podría llevar más de una hora. Aunque he dado instrucciones a mi cliente para que envíe paquetes nulos cada 60 segundos para mantener activa la sesión, todavía estoy paranoico de que la consulta / proceso mysql pueda finalizar, por lo que mis preguntas son:

  1. ¿Una sesión ssh cancelada (debido a la inactividad) matará el proceso de consulta mysql?
  2. ¿Cómo puedo asegurarme de que esto no suceda? ¿Son suficientes los paquetes nulos enviados cada 60 segundos?
njp
fuente

Respuestas:

9

La mayoría de los shells envían SIGHUP al grupo de procesos en primer plano al salir (y, en algunos procesos en segundo plano también, en bash, esto se controla con la opción de shell huponexit), lo que puede provocar que muera, dependiendo de cómo maneje eso su cliente mysql.

Puede ejecutar su comando antes nohupde que lo reparented por init si su shell se cierra, independientemente de si su shell envía SIGHUP o no (el hecho de que init lo reparented no está relacionado específicamente con nohup, es solo que ha sobrevivido a su padre).

Posiblemente una solución más aceptable sería el uso de tmux, screen, dtacho similar a ejecutar el cliente abstraído lejos de su concha y la terminal de control. De esta manera, si su shell se desconecta, simplemente se vuelve a conectar a la sesión en la que estaba ejecutando la consulta.

En general, los paquetes keepalive no importan, la conexión no terminará sin ninguna razón. Una preocupación más apremiante sería una pérdida de conexión entre el cliente y el servidor por otras razones (falla de la red, etc.).

Chris Down
fuente
¡Gracias! Solo para aclarar, estoy ejecutando la consulta real dentro de mysql, por lo tanto, siempre y nohupcuando anteponga al iniciar sesión en mysql, ¿persistirán las consultas que se ejecutan dentro?
njp
1
@njp Si desea ejecutar de forma interactiva, nohupno le será de mucha utilidad, ya que mysql REPL no estará conectado al terminal. Intente usar uno de los multiplexores (o dtach) que mencioné anteriormente, probablemente se adaptarán mejor a sus necesidades.
Chris Down
2

Comencé a ejecutar screensesiones cuando ingresé en una caja, en parte para evitar eso y, como beneficio adicional, obtengo varias pestañas, no puedo superarlo. Si estoy desconectado por algún motivo, puedo volver a conectarlo a mi sesión de pantalla.

Actualizar

Para responder # 2, correría mysqldesde un shell bash a través de una sesión de pantalla. Suena complicado, pero es solo:

$: screen
$: mysql

Puede editar su archivo ~ / .screenrc para agregar subtítulos en la parte inferior de la sesión de pantalla para que pueda realizar un seguimiento de sus pestañas, cambiar el nombre de sus pestañas, etc. Si alguna vez se desconecta, cuando vuelva a conectarse simplemente ejecute

$: screen -d

y eso mostrará cualquier sesión separada. Para volver a conectar, simplemente ejecute algo como

$: screen -r 551.pts-0.git

O cualquiera que sea el id de la sesión de pantalla. Estás de vuelta donde lo dejaste. Sin screen -dembargo, debe ejecutarse como el mismo usuario que inició la sesión de pantalla, solo para su información o raíz, por supuesto. No estoy realmente seguro porque después de ingresar siempre, sudo su -así que no tengo que sudo cada comando.

MDMoore313
fuente
1
Si bien el consejo para usar screenes sólido, no responde directamente a las dos preguntas enumeradas por el OP.
Barun