screen faz com que “tail -F | grep ”para ecoar linhas incomparáveis

5

Este é o Ubuntu (3.13.0-29-generic # 53), tentando fazer um script bash simples para monitorar um arquivo de log de linhas correspondentes.

Se eu fizer o seguinte, não haverá saída no shell bash, exceto para correspondências, o que é esperado:

tail -F server.log | grep --line-buffered "word" | tee -um wordwatch.log

Mas, se eu tentar fazer a mesma coisa em uma tela, a sessão recebe spam com dados não correspondentes do arquivo de registro assistido. Aparentemente, está mostrando tudo do arquivo de registro assistido. Este spam não aparece no arquivo de log de saída.

tela -S "wordwatch" tail -F server.log | grep --line-buffered "word" | tee -um wordwatch.log

O que estou fazendo de errado e como faço para impedir que o log assistido faça spams na sessão de tela?

    
por Dale Mahalko 31.08.2014 / 08:37

1 resposta

10

Quando você inicia o pipe dessa maneira:

screen -S "wordwatch" tail -F server.log | grep --line-buffered "word" | tee -a wordwatch.log

somente tail -F server.log é lançado em screen e todo o restante está conectado ao screen , não ao tail .

Portanto, você deve invocar seu script bash que já funciona:

screen -S "wordwatch" myworkingscript.sh

A outra abordagem é lançar o shell explicitamente e passar toda a linha para ele:

screen -S "wordwatch" bash -c 'tail -F server.log | grep --line-buffered "word" | tee -a wordwatch.log'

Além disso, a outra boa maneira de assistir a logs com tela - é a configuração especial:

#### logger.screenrc
sessionname     logger
hardstatus alwaysignore
split
split
screen  -t "Log One"  1 sh -c 'tail -F /a/b/c | egrep "xxxx" | tee -a '
focus
screen  -t "Log Two"  2 /home/somescript.sh
focus
screen  -t "Messages" 3 /home/otherscript.sh
focus
####

screen deve ser chamado assim:

# screen -c /home/logger.screenrc

Para sair, basta pressionar <CTRL-A><CTRL-\> e confirmar.

    
por 31.08.2014 / 08:53