Manipulação de exceções ao usar tail -f para monitorar um log

2

Eu tenho um script principal chamando o script para fazer o monitoramento.

Estou tentando capturar a exceção de que o log está ausente ou não está mais acessível.

tail -f é usado em vez de -F , pois os logs são nomeados com a data atual.

trap pode estar funcionando, mas não tenho certeza de qual sinal tail -f retornaria se o log que está sendo monitorado não estiver mais lá.

Caso contrário, devo apenas fazer uma verificação de loop no script principal, verificando [ -r $Log] ?

    
por geledek 30.07.2013 / 04:11

3 respostas

1

Eu acabei de tentar e ver qual é o principal problema aqui.

Se eu fizer um tail -f em um arquivo existente e, em seguida, remover o arquivo, tail não notará isso. A reson é simples: tail -f abre um identificador de arquivo somente leitura que referencia o conteúdo do arquivo. Agora, se o arquivo desaparecer, apenas a entrada do meta-diretório desaparecerá. A alocação será liberada, quando o último FH for fechado - o que é tail neste caso.

Então você precisa

  • coloque tail -f em um processo em segundo plano próprio, lembre-se de seu PID.
  • Iniciar outro processo que monitora a existência do arquivo (em um loop while a cada segundo ou algo parecido)
  • Se esse monitor perceber que o arquivo foi removido, ele deverá sinalizar o PID do processo final correspondente - com um sinal de sua escolha - você pode usar trap no processo final.
por 30.07.2013 / 16:14
2

O programa tail não notará que o arquivo foi excluído. Você precisa de algo mais para isso. O recurso inotify no Linux permite que um aplicativo seja notificado sobre eventos de arquivo; a maioria dos outros unices tem instalações semelhantes. O comando a seguir imprime uma notificação quando file.log é excluído:

inotifywait -e delete file.log
    
por 31.07.2013 / 03:16
1
$ tail -f blah
tail: cannot open 'blah' for reading: No such file or directory
$ echo $?
1

Você pode testar isso quando o arquivo não existir, mas não ajudará se o arquivo ficar inacessível. Um while loop pode ser melhor neste cenário:

while [ 1 ]
do
        tail $1
        if [ "$?" != "0" ]
        then
                echo "No access to file"
                exit 1
        fi
done

Eu tive a ideia em uma resposta do Stackoverflow . Existem alternativas lá, mas esta é simples.

    
por 30.07.2013 / 12:09