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…
-
Adicione o sinalizador -t ao ssh.
ssh -t server-01 "tail -f /var/log/server.log | grep test"
-
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.