Capture a saída de múltiplas linhas do grep em uma variável

1

Estou usando o script zabbix_sender.sh do Zabbix para enviar os rastreamentos de pilha de exceção para o meu servidor de monitoramento remoto do Zabbix.

zabbix_sender.sh requer uma chave e um valor para os dados que envia. Ele pode ler dados de stdin , mas isso substitui qualquer variável de chave especificada. Como meus dados stdin não são formatados como o Zabbix espera, preciso passar "valor" como argumento. Espero que isso forneça algum contexto.

O que eu quero realizar é capturar o resultado de múltiplas linhas de grep em uma variável, preservando as novas linhas, para que eu possa chamar o script zabbix_sender.sh com essa variável como um argumento.

O que eu tentei até agora parece com isso:

tail -Fn0 /var/log/uwsgi.log | grep "Exception:" -A 100 | (read tback; /usr/local/zabbix/bin/zabbix_sender -z myzserver.com -s MyHostName -k uwsgi_traceback -o $tback)

Como melhor eu posso dizer, isso nunca invoca zabbix_sender.sh .

Para testar, tentei usar este comando, que também não parece funcionar:

tail -Fn0 /var/log/uwsgi.log | grep "Exception:" -A 100 | (read errorlines; echo "$errorlines" > /tmp/errorlines.txt)

O arquivo /tmp/errorlines.txt nunca é criado.

Como posso capturar as linhas de saída de grep em uma variável para que eu possa chamar outro script com essa variável como argumento?

    
por skyler 05.04.2014 / 18:49

3 respostas

1

O problema é a parte da cauda; já que está no modo contínuo, nunca cuspirá algo para "ler".

Isso deve funcionar:

#!/bin/bash
echo "0" >/tmp/numberoflines
IFS=''
while [ 1 ]
do
    NUMBER=$(cat /tmp/numberoflines)
    LINES=$(wc -l < /var/log/uwsgi.log)
    DIFFERENCE=$(($LINES-$NUMBER))

    if [ $DIFFERENCE != 0 ]; then
            exception=$(tail -n $DIFFERENCE /var/log/uwsgi.log | grep "Exception:" -A 100)
           /zabbix/bin/zabbix_sender -z myzserver.com -s MyHostName -k uwsgi_traceback -o $tback) $exception;
    fi

sleep 5;
echo "$LINES" >/tmp/numberoflines
done
    
por 05.04.2014 / 22:15
2

Aqui minha abordagem.

  1. Use a tecla zabbix "log" para monitorar o padrão de erros em um arquivo de log (/var/log/uwsgi.log é o caso aqui).
  2. invocar o comando remoto zabbix acionado pelo acima 1. Este comando remoto busca linhas que cercam o erro pelo comando linux tail (1).

As vantagens desta abordagem são:

  1. Não é necessário instalar o script especial do lado do host do agente de configuração & (como zabbix_sender.sh discutido acima). O item do tipo 'log' do zabbix já foi fornecido com esse tipo de propósito.
  2. nenhum script zabbix_sender.sh-like no host do agente significa que não há CPU adicional & consumo de memória. Buscar várias linhas em torno do erro no log acontece apenas no acionador.

Deixe-me explicar os detalhes sobre como configurar abaixo:

  1. registre expressão regular no zabbix em Administração > Geral > Expressões regulares > [Nova expressão regular] como "erro | falha | fatal". Vamos supor que o nome da variável seja @uwsgi_error_pattern.
  2. registrar item da Configuração > Hosts > Linha [host de destino] > Itens > [Criar item] com os seguintes atributos:
    • Descrição: [qualquer nome]
    • Tipo: Agente do Zabbix (ativo)
    • Chave: log [/var/log/uwsgi.log,@uwsgi_error_pattern]
    • Tipo de informação: log
  3. registrar o segundo item em Configuração > Hosts > Linha [host de destino] > Itens > [Create Item] com os seguintes atributos, para aceitar o flag de log obtido enviado pelo comando remoto zabbix (mencionado posteriormente):
    • Descrição: [qualquer nome]
    • Tipo: caçador de zabbix
    • Chave: my_app.fetch_uwsgi_log
    • Tipo de informação: texto
  4. registre o acionador em Configuração > Hosts > Linha [host de destino] > Triggers > [Criar gatilho] com os seguintes atributos:
    • Nome: monitor de log do uwsgi em {HOSTNAME}
    • Expressão ({[host de destino]: log [/var/log/uwsgi.log,@uwsgi_error_pattern] .iregexp (@uwsgi_error_pattern)}) # 0 & ({[host de destino]: log [/ var / log / uwsgi.log, @ uwsgi_error_pattern] .nodata (300)}) = 0
  5. registra a ação que é executada remotamente para buscar dados em torno da linha de erro do arquivo de log da seguinte forma:
    • Nome: buscar o erro do log mais recente do uwsgi
    • Operações de ação:
      • Tipo de operação: comando remoto
      • Comando remoto: {HOSTNAME}: zabbix_sender -z [zabbix-server] -s {HOSTNAME} -k my_app.fetch_uwsgi_log -o "'tail -200 /var/log/uwsgi.log'"

NOTA-1: o nome da chave "my_app.fetch_uwsgi_log" na etapa acima é apenas um exemplo. Podemos definir qualquer nome exclusivo para ligar o zabbix_sender e o item.

NOTA-2: Você pode precisar de AllowRoot = 1 em /etc/zabbix/zabbix_agentd.conf para permitir que o zabbix-agent leia uwsgi.log.

    
por 08.06.2015 / 10:26
1

Você deve desativar divisão de palavras no bash, por exemplo, limpando o IFS:

export IFS=""
set NEWVAR='your tail|grep expression'

Agora, echo $NEWVAR tem as novas linhas.

    
por 05.04.2014 / 19:16