tail -f, 判断文件是否不再写入

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 不再接收输入)并向屏幕回显消息以提醒我该事件的最简单和最有效的方法是什么?

chx*_*chx 7

至少,如果您正在运行 Linux,那么您就是在逆向执行此操作。您应该使用inotify对正在写入的文件做出反应。

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

done
Run Code Online (Sandbox Code Playgroud)

那样做。


Joh*_*024 6

要获取打开日志文件的所有进程的进程 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)