我正在寻找一个脚本(bash / perl / python),该脚本每 5 秒由 cron 调用一次,检查是否有新行添加到我的特定日志文件。如果有任何新行,该脚本应向 root 发送包含日志事件的通知邮件。
有什么方法可以实现这个目的?
答案1
答案2
这可以通过执行以下任务的 bash 脚本来完成:
- 让后台进程监视每个日志文件
tail -f
,并将输出写入缓冲区位置。 - 定期收获、采取行动和截断缓冲位置。
我会使用单个脚本,可能像 init 脚本一样启动,而不是 cron 作业。例如:
#!/bin/bash
RECIPIENT=root
SUBJECT="Log monitor"
PERIOD=5 # Harvest log buffer every PERIOD seconds
# Prepare the log buffer and ensure it is empty
LOGBUFFER=/tmp/logbuffer.$$
cp /dev/null $LOGBUFFER
# Monitor the log files in the background.
# More than one log file can be specified on the command line.
for file in "$@"; do
tail -f -n0 "$file" | while read line;do echo "$file: $line";done >> $LOGBUFFER &
done
# Harvest the log buffer
while :;do
if [ -s $LOGBUFFER ]; then
mail -t "$RECIPIENT" -s "$SUBJECT" < $LOGBUFFER
cp /dev/null $LOGBUFFER
fi
sleep $PERIOD
done
该脚本并不完美(例如,它/tmp/logbuffer.123
在退出时会留下一个文件)但它应该可以帮助您入门。
答案3
如果您考虑改用 syslog-ng,您可以将其配置为自动启动 shell 脚本,该脚本可以根据 syslog 消息模式触发电子邮件。我已将此用于安全日志记录。
答案4
每 5 秒通过 cron 调用一次
Cron 没有小于分钟的粒度。如果您想要这种粒度,则需要 incrond。只需执行类似以下操作:
/var/log IN_CLOSE_WRITE /usr/local/sbin/notify.sh $@/$#
以及一个向您发送邮件的脚本:
tail $1 | mail -s "New lines in: $1" root
您可能需要尝试使用正确的事件类型。但是这样就没有必要以定时方式启动脚本。如果您正确设置了 incrontab,则可以确保每次启动脚本时都会发生一些变化。