![如何确定连续审核日志轮换中新关闭的文件?](https://linux22.com/image/40367/%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E8%BF%9E%E7%BB%AD%E5%AE%A1%E6%A0%B8%E6%97%A5%E5%BF%97%E8%BD%AE%E6%8D%A2%E4%B8%AD%E6%96%B0%E5%85%B3%E9%97%AD%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我试图找到确定何时创建第二个文件(符合匹配条件)的最佳方法。上下文是审核日志轮换。
给定一个每小时创建审核日志的目录,我需要awk
对已关闭的审核日志执行解析脚本。我的意思是,每小时都会创建一个新的审核日志,并关闭旧的审核日志,其中包含最多一个小时的信息。新的日志文件将被保留,直到它也被关闭并创建一个新的日志文件。
我可以创建一个 bash shell 脚本并使用find /home/tomcat/openam/openam/log -name amAuthentication.* -mmin -60
,然后通过一个crontab
条目每 10 分钟执行一次,但我不知道如何编写其余部分。
我想脚本可以通过将该 find 的内容保存到临时文件开始,然后在每次crontab
执行时比较新的 find 命令内容,当它发生更改时,使用临时文件作为 awk 脚本的输入。脚本完成后awk
,将新查找的内容保存到文件中。
一位同事建议我使用老式的“粘性位”来标记已处理的文件。也许这就是继续下去的方法。
答案1
尝试使用inotifywait
它:
inotifywait -e close_write /home/tomcat/openam/openam/log/CURRENT_OPENED_LOG_FILE
答案2
作为结束,这是我要使用的脚本的开始。它需要更多的工作来使其健壮并进行日志记录,但您应该了解总体思路。
#!/bin/sh
# This script should be executed from a crontab that executes every 5 or 10 minutes
# the find below looks for all log files that do NOT have the sticky bit set.
# You can see the sticky bit with a "T" from a "ls -l".
for x in `find /home/tomcat/openam/openam/log/ -name "log-*" -type f ! -perm -1000 -print`
do
# Look for open files. For safety, log that we are skipping them
if lsof | grep $x > /dev/null; then
# create a log entry on why I'm not processing this file...
echo $x " is open"
else
# $x "is closed and not sticky"
# run the awk scripts to process the file!
echo $x " processing with awk..."
# Set the sticky bit to indicate we have processed this file
chmod +t $x
fi
done