Como evitar que um programa morra quando sua sessão ssh morre?

3

Eu tenho um aplicativo de console muito antigo que quero tornar um pouco mais resiliente. O programa é usado desta maneira:

  • o usuário usa um emulador de terminal personalizado para se conectar a uma máquina remota por meio do ssh
  • o usuário inicia um script de shell
  • o script de shell pode iniciar um processo de banco de dados de progresso de longa execução.

Obviamente, às vezes, os usuários simplesmente perdem a conexão ssh com a máquina e, nesse caso, a sessão ssh é finalizada, o script de shell em execução é finalizado e, finalmente, o processo do banco de dados de progresso é finalizado também. Em um caso de mil que causa corrupção no banco de dados, eu gostaria de evitar que isso acontecesse.

O que eu tentei até agora:

  • iniciando uma sessão de tela ou tmux antes de iniciar o script de shell - isso não funciona porque o aplicativo precisa da variável TERM para ser configurado como at386 (e ignora completamente o termcap / terminfo ... ugh ...)
  • nohup / disown o processo de progresso - isso não funciona porque o shell script e o processo de progresso estão continuamente se comunicando uns com os outros de maneira obscura, parece

Alguma outra ideia de como garantir que o processo de progresso não termine quando a sessão ssh é eliminada?

    
por Zizzencs 23.05.2011 / 21:39

4 respostas

5

Adicione term at386 ao seu .screenrc para substituir o TERM. Se isso não ajudar, tente dtach em vez de Screen (que não faz nenhuma emulação de terminal).

    
por 23.05.2011 / 23:08
4

Em muitos casos, a solução mais simples é usar nohup e colocar o processo não interativo em segundo plano usando & e redirecionar a saída padrão e o erro padrão para os arquivos.

    
por 24.05.2011 / 17:22
2

Em outras palavras, você está procurando algo como a tela, mas que passa as seqüências de controle para o terminal em vez de fazer sua própria tradução? Tente dtach . Ele fornece o mesmo recurso de separação de terminal que a tela, mas sem as múltiplas janelas ou a emulação do terminal.

    
por 23.05.2011 / 23:22
0

Talvez tente um desktop X remoto via vnc ou nx. Você poderia encapsular vnc sobre ssh para segurança ou usar nx que é executado via ssh por padrão (e é muito mais rápido). O aplicativo poderia então ser executado em um Terminal na área de trabalho X e, se a conexão fosse perdida, a área de trabalho continuaria permitindo a reconexão a qualquer momento. Minha preferência é o No Machine NX, que é gratuito para até dois usuários simultâneos e é instalado com facilidade.

Uma alternativa, se disponível, é usar um console remoto via ALOM, ILOM, DRAC, console IP-kvm ou IP-serial, etc. Dessa forma, o aplicativo seria executado no console e não poderia ser interrompido por uma falha de conexão.

    
por 23.05.2011 / 22:46