我用来tail -f
跟踪日志文件的增长。我无法找到一种方法来检测正在写入日志文件的进程(当它崩溃或以其他方式终止时)是否不再访问或写入该文件。
这是我正在使用的脚本
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
检测写入日志文件的进程已停止(或 tail -f 不再接收输入)并将消息回显到屏幕以提醒我该事件的最简单和最有效的方法是什么?
答案1
至少如果你运行的是 Linux,那么你是在倒退。您应该使用inotify
对正在写入的文件做出反应。
#!/bin/sh
while inotifywait -qe modify filename
do
done
就可以了。
答案2
要获取打开日志文件的所有进程的进程 ID,请使用lsof
:
lsof -Fp /path/to/your/logfle
请注意,这只会显示实际打开文件的进程。您可能会错过使文件保持关闭状态的程序,除了实际需要写入文件的短暂时刻。
lsof
脚本友好并且有很多选项。看man lsof
。
这是一个脚本,一旦没有进程打开日志文件,它将向屏幕写入一条消息:
while lsof -Fp /tmp/mylogfile >/dev/null
do
sleep 1
done
echo "No processes have the log file open"
上面有一个问题:您的tail -f
进程将打开该文件。当打开该文件的进程数低于两个时,您可能希望显示该消息:
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"
答案3
#!/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
因此,可以这样称呼它lifealert.sh
,并在后台运行它,如下所示./lifealert.sh &
当 if 语句触发时,它将打印到 stderr,当您尾部文件时,您应该在终端中看到它。