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á.
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?
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á.
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"
#!/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.
Tags files tail open-files