Têm script bash executado contra um arquivo ao vivo - É possível?

3

Eu tenho um script que escrevi e (finalmente) que ele funcione como eu quero, desde que eu o execute em um arquivo estático. Existe uma maneira de rastrear um arquivo ao vivo e fazer com que o script execute suas ações no arquivo final à medida que cada linha entra no arquivo ao vivo?

Eu tentei

tail -f logfile.txt | ./myscript.sh

e

./myscript.sh <logfile.txt

Mas nenhum deles parece produzir os resultados desejados. Meu palpite é que (no primeiro exemplo) o myscript.sh não será executado até que o tail -f termine, o que acaba com o propósito :)

Eu não sei porque o segundo exemplo não funciona ... parece que deveria, mas lê em todo o conteúdo do arquivo, mas não as novas linhas como elas entram em logfile.txt

    
por samgoober 11.12.2015 / 18:18

1 resposta

2

Aqui está uma simples prova de conceito:

Em myscript.sh:

#!/bin/bash

while read -r line; do
  echo "syslog says: $line"
done

Em um terminal:

$ tail -n 0 -F /var/log/syslog | ./myscript.sh

(observe que estou usando -n 0 porque não quero processar nenhum conteúdo de log anterior; se você quiser processá-lo all , altere esse para -n +1 para iniciar a cauda a partir da primeira linha). Eu também estou usando -F em vez de -f , de modo que a cauda tente novamente se o arquivo original ficar inacessível - por exemplo, como resultado de ser rotacionado.

Em um terminal diferente

$ logger "logger says hello"

Você deve ver imediatamente no primeiro terminal algo como

syslog says: Dec 11 13:48:54 T61p steeldriver: logger says hello

Se não funcionar, talvez seja porque o que quer que esteja gravando no arquivo de log está fazendo isso de forma bufferizada, ou você está processando-o de maneira bufferizada dentro do seu script ( grep às vezes é o culpado: ele tem uma opção --line-buffered que pode ser útil nesse caso).

    
por steeldriver 11.12.2015 / 19:57