Minha consulta MySQL continuará sendo executada mesmo se minha conexão ssh cair?

16

Liguei-me a um servidor via SSH e efetuei login no mysql e solicitei que ele executasse uma consulta (cujos resultados são despejados em um CSV) que poderia levar mais de uma hora. Embora eu tenha instruído meu cliente a enviar pacotes nulos a cada 60 segundos para manter a sessão ativa, ainda estou paranóico de que a consulta / processo mysql possa terminar, então minhas perguntas são:

  1. Uma sessão ssh cancelada (devido à inatividade) matará o processo de consulta do mysql?
  2. Como garantir que isso não aconteça - o pacote nulo envia a cada 60 segundos o suficiente?
njp
fonte

Respostas:

9

A maioria das shells envia o SIGHUP ao grupo de processos em primeiro plano na saída (e, em alguns processos em segundo plano, no bash isso é controlado com a opção shell huponexit), o que pode causar a morte, dependendo de como o cliente mysql lida com isso.

Você pode executar seu comando anexado nohuppara que ele seja reparado pelo init se o seu shell sair, independentemente de o seu shell enviar ou não SIGHUP (ser reparado pelo init não está relacionado especificamente ao nohup - apenas sobreviveu ao pai).

Possivelmente uma solução mais palatável seria a utilização de tmux, screen, dtachou similar para executar o cliente abstraída do seu shell e controlar terminal. Dessa forma, se seu shell for desconectado, você apenas se reconectará à sessão em que estava executando a consulta.

Em geral, os pacotes keepalive não importam, a conexão não será encerrada apenas por nenhuma razão. Uma preocupação mais urgente seria a perda de conexão entre o cliente e o servidor por outros motivos (falha na rede, etc.).

Chris Down
fonte
Obrigado! Apenas para esclarecimento, estou executando a consulta real no mysql - desde que eu prefira nohupao efetuar login no mysql, isso persistirá nas consultas em execução no interior?
njp 20/12/13
11
@njp Se você deseja executar interativamente, nohupnão será muito útil para você, uma vez que o mysql REPL não será anexado ao terminal. Tente usar um dos multiplexadores (ou dtach) que mencionei acima, provavelmente eles atenderão melhor às suas necessidades.
Chris Baixo
2

Comecei a executar screensessões quando ssh em uma caixa, parcialmente para evitar isso e, como um bônus adicional, recebo várias guias, não consigo vencê-las. Se eu for desconectado por algum motivo, posso anexar novamente à minha sessão na tela.

Atualizar

Para responder a # 2, eu corria mysqlde dentro de um shell bash através de uma sessão de tela. Parece complicado, mas é apenas:

$: screen
$: mysql

Você pode editar seu arquivo ~ / .screenrc para adicionar legendas na parte inferior da sessão da tela para poder acompanhar suas guias, renomear suas guias etc. Se você estiver desconectado, ao se reconectar, execute

$: screen -d

e isso mostrará todas as sessões desanexadas. Para reconectar, basta executar algo como

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

Ou seja qual for o ID da sessão de tela. Você está de volta de onde parou. Você deve executar screen -dcomo o mesmo usuário que iniciou a sessão de tela, apenas fyi ou raiz, é claro. Não tenho muita certeza, porque depois de entrar no ssh sempre sudo su -faço para não ter que executar todos os comandos.

MDMoore313
fonte
11
Embora o conselho a ser usado screenseja sólido, ele não responde diretamente às duas perguntas listadas pelo OP.
Barun