我正在寻找一个脚本(bash / perl / python),每5秒钟由cron调用它将检查是否新行添加到我的特定日志文件。 如果有新行,脚本应该邮寄根目录包含日志事件的通知。
有什么办法可以做到这一点?
你可以试试Tenshi。 它是用Perl编写的,非常容易设置,完全按照你的要求。 来自Ubuntu的软件包描述:
“Tenshi是一个日志监控程序,旨在监视与用户定义的正则expression式匹配的行的一个或多个日志文件并报告匹配情况。正则expression式被分配给具有警报间隔的队列和邮件收件人列表。
Ubuntu软件包( 链接 ),Debian软件包( 链接 )。
这可以通过执行以下任务的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文件),但它会让你开始。
如果您考虑切换到使用syslog-ng,您可以将其configuration为自动启动一个可以基于syslog消息模式触发电子邮件的shell脚本。 我有这个安全日志logging。
每5秒钟由cron调用一次
Cron的粒度不会比分钟小。 如果你想要这种粒度,你需要incrond。 只是有这样的东西:
/var/log IN_CLOSE_WRITE /usr/local/sbin/notify.sh $@/$#
和一封邮件给你的脚本:
tail $1 | mail -s "New lines in: $1" root
你可能需要玩正确的事件。 但是这将使得不必以定时的方式启动脚本。 如果您正确设置了incrontab,则可以确保每次脚本启动时都会发生更改。