Quebra de instrução while-read

2

Estou trabalhando em um script para monitorar arquivos de log de alguns servidores e alertas de email / txt quando determinadas palavras-chave são exibidas. Tudo está funcionando bem até este ponto usando:

tail -n 0 -f "$MS01_LOG_FILE" "$MS02_LOG_FILE" | while IFS= read -r line; do
#do some fun things here
done

O problema é que, às vezes, o servidor desliga não gera saída para o arquivo de log por algum tempo, e eu gostaria de ser notificado de um log parado. É claro que meu roteiro ficará na linha de espera aguardando entrada. Preciso de um temporizador que seja executado em segundo plano, suponho que possa quebrar a linha de leitura.

    
por Tom 31.10.2018 / 16:07

1 resposta

1

TL; DR

A seguinte alternativa deve ser o truque:

#!/bin/bash

MS01_LOG_FILE=/var/log/dmesg
MS02_LOG_FILE=/var/log/syslog

TIMEOUT=10  # modify to your liking

tail -n 0 -f "$MS01_LOG_FILE" "$MS02_LOG_FILE" | while :
do
    IFS= read -t $TIMEOUT -r line
    # do your funny things here
done

Detalhes

Primeiro, citando o help read (consulte manual de referência bash para o comando embutido "read" )

-t timeout
Cause read to time out and return failure if a complete line of input (or a specified number of characters) is not read within timeout seconds. timeout may be a decimal number with a fractional portion following the decimal point. This option is only effective if read is reading input from a terminal, pipe, or other special file; it has no effect when reading from regular files. If read times out, read saves any partial input read into the specified variable name. If timeout is 0, read returns immediately, without trying to read and data. The exit status is 0 if input is available on the specified file descriptor, non-zero otherwise. The exit status is greater than 128 if the timeout is exceeded.

Observe que o status de saída que é maior que 128 para detectar um tempo limite de leitura não é garantido entre implementações (por exemplo, no bash do meu OS X é 1).

Agora, simplesmente adicionando -t $TIMEOUT ao seu script inicial fornece apenas uma parte da solução, já que o cano quebrado não será detectado até que algo seja emitido do tubo de escape.

Mover o read para um loop sem fim resolve esse problema.

Dependendo do que você deseja fazer, em vez de # do your funny things here , agora você pode ser confrontado com a questão de escapar dessa cadeia de processo infantil.

Nesse caso, verifique o link

    
por 01.11.2018 / 13:08

Tags