我有一个主脚本调用脚本来进行监控。
我试图捕获日志丢失或无法再访问的异常。
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
我的想法是在堆栈溢出答案。还有其他选择,但这个很简单。