Monitorização de múltiplos ficheiros com cauda Unix pode não funcionar como se espera
por Allen Fung, Engenheiro Sênior de Software
"tail -F" é comumente usado para monitorar arquivos para atualizações.
Veja como a cauda pode ser usada para monitorar vários arquivos ao mesmo tempo.
$ cauda -F arquivo1 arquivo2
O problema com o comando acima é que o texto escrito no arquivo1 e no arquivo2 pode não ser lavado para o disco em novos limites de linha. Como resultado, o texto de um arquivo pode ser emendado em texto do outro arquivo na saída da cauda.
Aqui está um exemplo do problema. Suponha que o seguinte é escrito no arquivo1.
linha_1
linha_2
linha_3
Além disso, suponha que o seguinte seja escrito no arquivo2.
LINHA_A
LINHA_B
LINHA_C
Se o texto não for lavado nos limites da nova linha, será possível obter a seguinte saída da cauda.
lineLINE_A
_1
LINHA_B
linha_2
LINHA_C
linha_3
Como você pode ver, "LINE_A" está emendada em "line_1", resultando em "lineLINE_A" na primeira linha. Aqui estão algumas maneiras de resolver o problema acima.
Executar várias caudas em paralelo e canalizar a saída de cada cauda para grep. Você precisará usar a opção em grep para imprimir somente em novos limites de linha.
Escreva uma nova cauda que só imprime quando recebe uma linha completa de um arquivo.
Modifique a aplicação que gerou os ficheiros de registo para criar apenas um único ficheiro de registo. Você precisará certificar-se de que o texto seja enviado para o arquivo único em novos limites de linha.
Aqui está o código a implementar (1) acima.
$ vi multitail.sh
#!/bin/sh
# Quando isto sair, saia também de todo o processo de fundo.
armadilha 'kill $(jobs -p)' EXIT
# iterar através de cada um dos nomes dos ficheiros
para arquivo em "$@".
fazer
# Ficheiro da cauda em fundo.
cauda -F $file | grep -line-buffered "" &
feito
# esperar ... até CTRL+C
esperar
Deixo ao leitor a tarefa de implementar (2) e (3).
Obrigado por ler!