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