Efetue o log da porta TCP quebrando mensagens em caracteres diferentes de nova linha

2

Estou trabalhando em um conjunto de scripts para monitorar alguns serviços externos que registram em uma porta TCP.

function handleMessage {
  while read message
  do
    # Handle $message
  done
}
nc -d $ipadd $port | handleMessage

Este código funciona bem quando as mensagens de log são delimitadas por novas linhas como as seguintes

Service started

ERROR: Something terrible happened

Service stopped

Mas um dos serviços delimita as mensagens usando LOGXXXX e permite novas linhas nas mensagens, de modo que sua saída se pareça mais com isso:

LOG0001 Service startedLOG0002 ERROR: Something terrible happened

NullPointerException at SomeMethod (File1.java)

SomeOtherMethod (File2.java)LOG0003 Service stopped

Usar meu código acima de handleMessage é chamado para cada uma das linhas em vez de para cada conjunto de segmentos LOGXXXX e se o tempo passar sem nenhuma mensagem contendo novas linhas, meu script fica muito atrasado no tratamento de mensagens.

Existe uma opção no nc ou outro programa que eu possa usar para ler essa porta TCP e quebrar em um delimitador personalizado, ou alguma opção para ter uma função bash manipulando cada gravação para stdout em vez de ser chamada apenas para cada linha?

    
por rjschnorenberg 01.02.2013 / 19:35

1 resposta

1

O problema aqui está na sua linha while read message . Por padrão, read termina em uma nova linha, mas você pode passar outro caractere com a opção -d .

A pergunta a fazer é em suas linhas LOGXXXX, como o script sabe quando a entrada está terminada? Se você puder colocar um caractere especial no final, poderá usar read -d . Caso contrário, você poderia substituir as novas linhas por outra coisa e colocá-las de volta depois.

Então, no seu exemplo:

function handleMessage {
  while read message
  realmessage='echo $message | tr '|' '\n''
  do
    # Handle $realmessage
  done
}
nc -d $ipadd $port | tr '\n' '|' | handleMessage

Então, você está substituindo todas as novas linhas com | , para que todas elas entrem na chamada read e, em seguida, você as divida depois.

    
por 10.11.2013 / 17:58