Email tail和grep日志和邮件(linux)

Email tail和grep日志和邮件(linux),email,shell,grep,tail,Email,Shell,Grep,Tail,我想用grep跟踪日志文件并通过邮件发送 比如: 我该怎么做呢?我要试一试。如果我讨厌的bash代码被仔细检查,也许我会学到一些东西。有可能已经有无数的解决方案可以做到这一点,但我不会去发现,因为我相信你们已经用拖网拖网了网络海洋的深度和宽度。听起来你想要的东西可以分为两位:1)定期获取文件的“最新尾部”,2)如果确实存在最新尾部,则通过电子邮件发送。对于1)中的定期间隔,请使用cron。为了获得最新的尾部(2),您必须跟踪文件大小。下面的bash脚本就是这样做的——它是一个可以由cron调用的

我想用grep跟踪日志文件并通过邮件发送 比如:


我该怎么做呢?

我要试一试。如果我讨厌的bash代码被仔细检查,也许我会学到一些东西。有可能已经有无数的解决方案可以做到这一点,但我不会去发现,因为我相信你们已经用拖网拖网了网络海洋的深度和宽度。听起来你想要的东西可以分为两位:1)定期获取文件的“最新尾部”,2)如果确实存在最新尾部,则通过电子邮件发送。对于1)中的定期间隔,请使用cron。为了获得最新的尾部(2),您必须跟踪文件大小。下面的bash脚本就是这样做的——它是一个可以由cron调用的解决方案。它使用缓存的文件大小来计算需要发送的文件块。请注意,对于文件myfile,将创建另一个文件.offset.myfile。此外,脚本不允许文件名中包含路径组件。重写或在调用中修复它[例如(cd/foo/bar&&segtail.sh zut),假设它被称为segtail.sh]

#!/usr/local/bin/bash
file=$1
size=0
offset=0
if [[ $file =~ / ]]; then
   echo "$0 does not accept path components in the file name" 2>&1
   exit 1
fi
if [[ -e .offset.$file ]]; then
   offset=$(<".offset.$file")
   fi
if [[ -e $file ]]; then
   size=$(stat -c "%s" "$file")    # this assumes GNU stat, possibly present as gstat. CHECK!
                                   # (gstat can also be Ganglias Status tool - careful).
fi
if (( $size < $offset )); then     # file might have been reduced in size
   echo "reset offset to zero" 2>&1
   offset=0
fi
echo $size > ".offset.$file"
if [[ -e $file &&  $size -gt $offset ]]; then
   tail -c +$(($offset+1)) "$file" | head -c $(($size - $offset)) | mail -s "tail $file" foo@bar
fi
#/usr/local/bin/bash
文件=$1
大小=0
偏移量=0
如果[[$file=~/]];然后
echo“$0不接受文件名”2>中的路径组件(&1)
出口1
fi
如果[-e.offset.$file]];然后
偏移量=$(&1)
偏移量=0
fi
echo$size>“.offset.$file”
如果[[-e$file&&$size-gt$offset]];则
tail-c+$($offset+1))“$file”| head-c$($size-$offset))| mail-s“tail$file”foo@bar
fi

当电子邮件发送错误时,是否要发送电子邮件?可能会失败;)

但是,您可以尝试以下方法:

tail -f $log |
grep --line-buffered error |
while read line
do
    echo "$line" | mail -s subject "$email"
done
它为grep输出中的每一行发送一封电子邮件

在shell脚本之上运行

nohup ./monitor.sh &
因此,它将在后台继续运行。

如何:


邮件-s“catalina.out错误”blah@myaddress.com这个问题就像“我有
print('Foo');
我想要它打印'Foo'。我该怎么做?”你的问题到底是什么?你可能不想要
tail
-f,因为它会一直跟随文件的底部<代码>grep也不跟踪日志。您试图解决的问题是什么?
tail-fgrep…
是随着文件的增长而输出附加数据,使用grep时,它只打印仅与问题的grep部分匹配的附加行。本文中没有回答您的问题。左为练习。需要在文件名变量展开后加上全引号。并非所有系统的bash路径都正确;可以通过
env
调用。
stat
的输出在系统和版本之间变化很大(!)。假设最近的GNU统计数据,尝试使用-c来解决这个问题并避免解析。不需要
cat
offset=$($offset]]
是一个词法比较,因此如果
$size
==10和
$offset
==2,它将不会执行您期望的操作。请改用这个:
如果[-e$file]]&($size>$offset))
。在
(())
$(())
中的大多数情况下,您可以省略美元符号。跟进了大多数建议-谢谢(>再次比较我,argh)。看不到我的提交消息(还吗?),不知道为什么。我不追求完全的可移植性,也不太喜欢env,而且,我会在大多数情况下调查“most”。您不需要尾部的反斜杠——shell会在下一行查找尾部管道(还有
&
&
|
),假设我也想在错误后打印10行(grep-10个错误)。在你的方法中,我将收到10封电子邮件,我需要做什么才能只收到一封邮件,包括10行内容?@markus你找到任何方法来执行你要求的操作吗?我认为crontask可以使用最后已知的行长度(wc-l)对日志文件进行grep并且只发送新事件的电子邮件。这样,脚本不会一直运行。然后,我必须弄清楚如何在日志旋转时重置字数。我很惊讶,还没有编写脚本来执行此操作…许多管理员有此需要,但不想使用付费工具。只有这样,您才能在整个文件中搜索这些内容线终端与wc,然后再次与尾巴得到最后几行。
nohup ./monitor.sh &