使用 tail -f 监控日志时的异常处理

使用 tail -f 监控日志时的异常处理

我有一个主脚本调用脚本来进行监控。

我试图捕获日志丢失或无法再访问的异常。

tail -f使用而不是-F因为日志以当前日期命名。

trap可能有效,但我不确定tail -f如果被监视的日志不再存在,会返回什么信号。

否则,我应该在主脚本中进行循环检查吗[ -r $Log]

答案1

程序tail不会注意到文件已被删除。为此你需要其他东西。这inotifyLinux 上的功能允许应用程序收到有关文件事件的通知;大多数其他大学都有类似的设施。以下命令在file.log删除时打印通知:

inotifywait -e delete file.log

答案2

我只是尝试了一下,看看主要问题出在哪里。

tail -f如果我对现有文件执行a 然后删除该文件,tail则根本不会注意到这一点。原因很简单:tail -f打开一个引用文件内容的只读文件句柄。现在,如果文件消失,则只有元目录条目消失。当最后一个 FH 关闭时,分配将被释放 -tail在本例中就是这样。

所以你必须

  • 放入tail -f它自己的后台进程中,记住它的PID。
  • 启动另一个进程来监视文件的存在(每秒一个 while 循环或类似的东西)
  • 如果该监视器发现文件已消失,它必须向相应尾部进程的 PID 发出信号 - 使用您选择的信号 - 您可以trap在尾部进程中使用。

答案3

$ tail -f blah
tail: cannot open `blah' for reading: No such file or directory
$ echo $?
1

当文件一开始就不存在时,您可以进行测试,但如果文件变得无法访问,它不会对您有帮助。while在这种情况下,循环可能会更好:

while [ 1 ]
do
        tail $1
        if [ "$?" != "0" ]
        then
                echo "No access to file"
                exit 1
        fi
done

我的想法是在堆栈溢出答案。还有其他选择,但这个很简单。

相关内容