Como “rastrear” múltiplos arquivos ou fluxos de pipe?

0

Eu preciso monitorar muitos servidores da Web para erros de tempo de execução e tenho uma ideia de executar um script como

#!/bin/bash -e

# Example set of hosts
HOSTS=(
host1
host2
)

for host in ${HOSTS[@]}
do
        [[ ! -e ${host}.pipe ]] && mkfifo ${host}.pipe
        (ssh -n $host "tail -n0 -F /tmp/test" >> ${host}.pipe) &
done

tail -F -c +0 *.pipe

e supostamente me daria essa saída:

==> host1.pipe <==
event 1
event 2

==> host2.pipe <==
event 3
event 4

==> host1.pipe <==
event 5

Você começa o ponto. Eu vejo linhas de log como elas aparecem, com sua origem sendo óbvia de como tail -F mostra normalmente quando você roda em mais de um arquivo.

Opções de cauda -c +0 supostamente faz com que imprima o conteúdo do fluxo a partir do 0º byte.

Mas isso não funciona! O que vejo é como

==> host1.pipe <==
event 1
event 2
event 5

Ou seja, nenhum fluxo, exceto o primeiro, é mostrado.

Veja a variação mais simples do script acima, ainda reproduzindo o problema:

tail -F -c +0 \
        <(ssh host1 "tail -n1 -F /tmp/test") \
        <(ssh host2 "tail -n1 -F /tmp/test") \
        ;

Ainda mais simples, ainda reproduzindo o problema:

tail -F -c +0 \
    <(while true; do date;     sleep 1; done) \
    <(while true; do date +%s; sleep 1; done)

Estou usando o kernel de coreutils 8.27 e o kernel Linux 4.9.14.

Agradecemos antecipadamente por qualquer dica!

Note que não gostaria de ser sugerido para usar "multitail". Eu tentei, dividir a tela em painéis não vai escalar para dezenas de servidores que temos agora.

    
por Andrey Utkin 23.08.2017 / 14:41

1 resposta

0

Note that I won't like to be suggested to use multitail. I've tried it, splitting screen in panes won't scale to dozens of servers which we have now.

Que tal a opção -L ? Não divide a tela.

multitail \
  --mark-change \
  -L "while sleep 1; do date;     done" \
  -L "while sleep 5; do date +%s; done" \
  -L "while sleep 7; do date +%Y; done"

Se você quiser usar pipes nomeados, use -I em vez de -L . Infelizmente, multitail requer -I para cada arquivo, o que torna a abordagem curinga ( * ) mais difícil. Má sorte, sua opção -Iw parece não funcionar com pipes nomeados; e eu não consegui fazer a ferramenta cooperar com xargs (pelo menos no meu Debian).

Ainda existe uma maneira:

multitail --mark-change --mergeall *.pipe

A saída será muito parecida com o que você esperava de tail .

    
por 25.08.2017 / 11:01