Consola perdida quando o EC2 ssh está desconectado

1

Eu executo um aplicativo java como um servidor em um EC2. Mas à medida que perco minha conexão ssh, todas as mensagens do console também são perdidas. Quando eu redirecionar todas as mensagens para > my.log e, em seguida, usar tail -f my.log , eu não receberei as mensagens e.printstacktrace . Eu me pergunto o que posso fazer.

Existe algo simples que eu posso fazer, relogar para o ssh, descobrir qual console o aplicativo java está jogando fora todas as mensagens.

Então, ao invés de fazer um java myapp.jar & , eu agora faço um java myapp.jar , para que eu não perca nenhuma mensagem do console.

A outra pergunta é: Existe um comando melhor que > my.log que não perca nenhuma mensagem do meu aplicativo, para que eu possa fazer o log e fazer um tail -f my.log ?

    
por Siddharth 15.07.2012 / 09:02

2 respostas

3

Eu usaria um multiplexador de terminais - tela sendo a mais conhecida, e tmux sendo uma implementação mais recente da ideia. Eu uso o tmux e recomendo que você faça isso.

Basicamente o tmux irá rodar um terminal (ou conjunto de terminais) em um computador. Se você executá-lo em um servidor remoto, você pode desconectá-lo sem que o terminal morra. Então, quando você fizer o login novamente, poderá se reconectar e ver todas as saídas perdidas.

Para começar da primeira vez, basta digitar

tmux

Então, quando você deseja desconectar, você faz Ctrl-B d (isto é, pressione Ctrl-B, solte as duas teclas e, em seguida, pressione d.

Quando você faz login novamente, pode executar

tmux attach

e você se reconectará ao tmux e verá todas as saídas que aconteceram. Observe que, se você perder acidentalmente a conexão ssh (digamos que sua rede fique inativa), o tmux ainda estará em execução, embora possa pensar que ainda está conectado a uma conexão. Você pode dizer ao tmux para se desconectar da última conexão e conectar-se à sua nova conexão executando

tmux attach -d

Na verdade, você pode usar a opção -d o tempo todo. Nos servidores, eu tenho isso no meu .bashrc

alias tt='tmux attach -d'

Então, quando eu fizer login, posso digitar tt e reconectar. Você pode dar um passo adiante se quiser e integrar o comando em um alias para o ssh. Eu corro um cliente de email dentro do tmux em um servidor, e eu tenho um alias local:

alias maileo='ssh -t mail.example.org tmux attach -d'

Isso faz o ssh para o servidor e executa o comando no final - tmux attach -d A opção -t garante que um terminal seja iniciado - se um comando for fornecido, ele não será executado em um terminal por padrão. Portanto, agora posso executar maileo em uma linha de comando local e conectar-me ao servidor e à sessão do tmux. Quando eu me desconectar do tmux, a conexão ssh também é cancelada.

Isso mostra como usar o tmux para seu caso de uso específico, mas o tmux pode fazer muito mais do que isso. Este tutorial do tmux vai te ensinar um pouco mais, e há muito mais lá fora.

    
por Hamish Downer 15.07.2012 / 13:17
2

Você tem alguns problemas se quiser deixar o processo em execução quando se desconectar e ver toda a saída mais tarde.

Capturando Mensagens de Erro

Um problema com sua abordagem é que você está apenas redirecionando stdout, mas não stderr, então as mensagens de erro não irão para o arquivo. O idioma padrão para redirecionar toda a saída é:

java myapp.jar 2>&1 > myapp.log

Isso explica o que 2 > & 1 significa e < href="http://tldp.org/LDP/abs/html/io-redirection.html"> isso fornece capítulo e verso sobre o redirecionamento do i / o bash .

Se você quiser ver a diferença, você pode fazer

java myapp.jar > myapp.log 2> myapp.err

Deixar o processo em execução quando você desconecta

Mesmo executando em segundo plano (anexando & ao comando), um processo ainda é anexado a um terminal. Quando o terminal morre, todos os subprocessos serão mortos, incluindo aqueles em segundo plano.

Para mantê-los vivos, você pode

  • mantenha o terminal ativo apesar de perder sua conexão usando um multiplexador de terminal (veja minha outra resposta ou,
  • use nohup que manterá o comando em execução (ignorando o SIGHUP) .

Para usar o nohup, redirecionando toda a saída para um log e colocando-a no plano de fundo, você pode simplesmente fazer:

nohup java myapp.jar 2>&1 > myapp.log &

Mais sobre nohup .

    
por Hamish Downer 15.07.2012 / 13:33