我想用grep尾部日志文件并通过邮件发送 像:
tail -f /var/log/foo.log | grep error | mail -s subject name@example.com
我该怎么做?
答案 0 :(得分:19)
您希望在收到错误的电子邮件时发送电子邮件?那可能会失败;)
你可以尝试这样的事情:
tail -f $log |
grep --line-buffered error |
while read line
do
echo "$line" | mail -s subject "$email"
done
grep输出中的每一行都发送一封电子邮件。
使用
运行上面的shell脚本nohup ./monitor.sh &
所以它会继续在后台运行。
答案 1 :(得分:2)
我会去看看。如果我的苛刻的bash代码被仔细检查,也许我会学到一些东西。有可能已经有很多解决方案可以做到这一点,但我不会发现,因为我相信你已经拖曳了网络海洋的深度和宽度。听起来你想要的可以分成两个部分:1)定期获取文件的“最新尾部”,2)如果最新的尾部确实存在,则通过电子邮件发送。对于1)中的常规间隔,请使用cron。要获得2)中的最新尾部,您必须跟踪文件大小。下面的bash脚本可以做到这一点 - 它是2)的解决方案,可以由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
答案 2 :(得分:0)
怎么样:
mail -s“ catalina.out错误” blah@myaddress.com