tail -f, Determina se um arquivo não está mais sendo gravado em [closed]

6

Estou usando tail -f para acompanhar o crescimento de um arquivo de log. Estou tendo problemas para encontrar uma maneira de detectar se o processo que está gravando no arquivo de log (quando ele falha ou é terminado de outra forma) não está mais acessando ou gravando no arquivo.

Aqui está o script que estou usando

tail -f log_file | while read LOGLINE
do
  echo -e "${LOGLINE}"
  if [[ "${LOGLINE}" == *ERROR* ]] ; then
  echo -e "ERROR FOUND : ${LOGLINE}\n"

  # handle the error here

  fi
done

Qual é a maneira mais fácil e eficiente de detectar que o processo de gravação no arquivo de log parou (ou que tail -f não está mais recebendo entrada) e ecoar uma mensagem para a tela me alertando sobre o evento?

    
por BryanK 26.04.2014 / 20:25

3 respostas

7

Pelo menos se você estiver executando o Linux, você está fazendo isso de trás para frente. Você deve usar inotify para reagir ao arquivo sendo gravado.

#!/bin/sh
while inotifywait -qe modify filename
do

done

isso fará.

    
por 27.04.2014 / 00:31
6

Para obter os IDs do processo de todos os processos que têm seu arquivo de log aberto, use lsof :

lsof -Fp /path/to/your/logfle

Observe que isso mostrará apenas processos que realmente tenham o arquivo aberto. Você pode perder programas que mantêm o arquivo fechado, exceto os breves instantes, quando eles realmente precisam escrever para ele.

lsof é amigável ao script e tem muitas opções. Veja man lsof .

Aqui está um script que gravará uma mensagem na tela quando não houver processos com o arquivo de log aberto:

while lsof -Fp /tmp/mylogfile  >/dev/null
do
    sleep 1
done
echo "No processes have the log file open"

Há um problema com o que foi mencionado acima: o processo tail -f terá o arquivo aberto. Você pode, em vez disso, mostrar a mensagem quando o número de processos com esse arquivo abrir abaixo de dois:

while [ "$(lsof -Fp /tmp/mylogfile | wc -l)" -ge 2 ]
do
    sleep 1
done
echo "There are less than two processes with the log file open"
    
por 26.04.2014 / 21:37
2
#!/bin/bash
PROC=apache2 # insert your process name here

while true; do
    pgrep $PROC > /dev/null # hides pgrep's output
    if [[ $? -ne 0 ]]; then
        echo "Call 911 $PROC died!" 1>&2 # redirects to stderr
        exit
    fi
    sleep 1
done

Portanto, chame isto de algo como lifealert.sh e execute-o em segundo plano, como ./lifealert.sh &

Quando a instrução if for disparada, ela será impressa em stderr, que você deverá ver no seu terminal enquanto estiver inserindo um arquivo.

    
por 26.04.2014 / 22:02