Arquivo de log de cauda em várias máquinas sobre ssh

31

Estou tentando tail um arquivo de log em várias máquinas remotas e encaminhar a saída para minha estação de trabalho local. Eu quero que as conexões sejam fechadas ao pressionar Ctrl - C .

No momento, tenho a seguinte função que quase funciona como pretendido.

function dogfight_tail() {
 logfile=/var/log/server.log
 pids=""
 for box in 02 03; do
   ssh server-$box tail -f $logfile | grep $1 &
   pids="$pids $!"
 done
 trap 'kill -9 $pids' SIGINT
 trap  wait
}

As conexões fecham e eu recebo a saída de tail . MAS, existe algum tipo de buffer acontecendo porque a saída vem em lotes.

E aqui está a parte divertida ...

Eu posso ver o mesmo comportamento de buffer ao executar o seguinte e anexar "test" ao arquivo /var/log/server.log nas máquinas remotas de 4 a 5 vezes ...

ssh server-01 "tail -f /var/log/server.log | grep test"

… e encontrou duas maneiras de desativá-lo…

  1. Adicione o sinalizador -t ao ssh.

    ssh -t server-01 "tail -f /var/log/server.log | grep test"
    
  2. Remova a cotação do comando remoto.

    ssh server-01 tail -f /var/log/server.log | grep test
    

No entanto, nenhuma dessas abordagens funciona para a função que é executada em várias máquinas mencionadas acima.

Eu tentei o dsh, que tem o mesmo comportamento de buffer durante a execução.

dsh -m server-01,server-02 -c "tail -f /var/log/server.log | grep test"

O mesmo aqui, se eu remover a citação, o buffer vai embora e tudo funciona bem.

dsh -m server-01,server-02 -c tail -f /var/log/server.log | grep test

Também tentei parallel-ssh , que funciona exatamente como dsh . Alguém pode explicar o que está acontecendo aqui?

Como corrijo este problema? Seria ideal para ir com ssh direto, se possível.

P.S. Eu não quero usar multitail ou similar, já que eu quero poder executar comandos arbitrários.

    
por deephacks 03.10.2014 / 11:19

3 respostas

29

O que você vê é o efeito de um buffer stdout padrão em grep fornecido pela Glibc. A melhor solução é desabilitá-lo usando --line-buffered (GNU grep, não tenho certeza de que outras implementações podem suportá-lo ou algo semelhante).

Quanto a por que isso só acontece em alguns casos:

ssh server "tail -f /var/log/server.log | grep test"

executa o comando inteiro entre aspas no servidor - assim, grep espera preencher seu buffer.

ssh server tail -f /var/log/server.log | grep test

executa grep em sua máquina local na saída tail enviada pelo canal ssh.

A parte chave aqui é que grep ajusta seu comportamento dependendo se o stdin é um terminal ou não. Quando você executa ssh -t , o comando remoto está sendo executado com um terminal de controle e, portanto, o controle remoto grep se comporta como seu local.

    
por 03.10.2014 / 12:43
2

veja isto: multitail

O MultiTail permite monitorar arquivos de log e saída de comandos em várias janelas em um terminal, colorir, filtrar e mesclar.

Para acompanhar os logs em vários servidores, use:

multitail -l 'ssh user@host1 "tail -f /path/to/log/file"' -l 'ssh user@host2 "tail -f /path/to/log/file"'
    
por 23.06.2016 / 12:49
0

Você pode fazer o checkout no registro do local.

Uma ferramenta Java que criei, capaz de ler arquivos de log locais e distantes usando o SSH. É bastante simples de usar.

Mais algumas explicações: link

Basta fazer o download da versão correspondente ao seu sistema operacional, do executável nativo do release jar em seu Java Runtime (requer java 8_40 ou superior):

link

Você pode encontrar uma documentação completa (incorporada com e na página do Github também)

    
por 20.01.2018 / 17:55

Tags