Bry*_*anK 7 tail open-files files
我正在使用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
Run Code Online (Sandbox Code Playgroud)
检测写入日志文件的进程已停止(或 tail -f 不再接收输入)并向屏幕回显消息以提醒我该事件的最简单和最有效的方法是什么?
至少,如果您正在运行 Linux,那么您就是在逆向执行此操作。您应该使用inotify
对正在写入的文件做出反应。
#!/bin/sh
while inotifywait -qe modify filename
do
done
Run Code Online (Sandbox Code Playgroud)
那样做。
要获取打开日志文件的所有进程的进程 ID,请使用lsof
:
lsof -Fp /path/to/your/logfle
Run Code Online (Sandbox Code Playgroud)
请注意,这只会显示实际打开文件的进程。您可能会错过保持文件关闭的程序,除非他们真正需要写入文件的短暂瞬间。
lsof
是脚本友好的并且有很多选项。见man lsof
。
这是一个脚本,一旦没有打开日志文件的进程,它就会向屏幕写入一条消息:
while lsof -Fp /tmp/mylogfile >/dev/null
do
sleep 1
done
echo "No processes have the log file open"
Run Code Online (Sandbox Code Playgroud)
上面有一个问题:您的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"
Run Code Online (Sandbox Code Playgroud)