Linux 试图通过cron作业在跟踪日志文件中遇到错误字符串时立即生成电子邮件警报

Linux 试图通过cron作业在跟踪日志文件中遇到错误字符串时立即生成电子邮件警报,linux,bash,shell,unix,scripting,Linux,Bash,Shell,Unix,Scripting,当此脚本从跟踪日志文件中读取错误字符串时,我需要生成电子邮件警报: #!/bin/bash echo "Script is starting" logLocation="/apps/ca/share/scripts/moveTos3.log" echo $logLocation Email_Dest="abc@abc.com" echo $Email_Dest tail -f $logLocation|while read line;do echo $line if [ `echo $line

当此脚本从跟踪日志文件中读取错误字符串时,我需要生成电子邮件警报:

#!/bin/bash

echo "Script is starting"
logLocation="/apps/ca/share/scripts/moveTos3.log"
echo $logLocation
Email_Dest="abc@abc.com"
echo $Email_Dest
tail -f $logLocation|while read line;do
echo $line
if [ `echo $line|grep error` -ne 0 ];
then
 mail -s "test3" $Email_Dest < echo $line;
fi
done
#/bin/bash
echo“脚本正在启动”
logLocation=“/apps/ca/share/scripts/moveTos3.log”
echo$logLocation
电子邮件地址=”abc@abc.com"
echo$Email\u Dest
tail-f$logLocation |在读取行时;做
回音$线
如果[`echo$line | grep error`-ne 0];
然后
邮件-s“test3”$Email\u Dest

到目前为止,我无法收到电子邮件。非常感谢您的帮助。

您在此处发布的代码永远不会发送电子邮件

if
条款:

if [ `echo $line|grep error` -ne 0 ];
then
 mail -s "test3" $Email_Dest < echo $line;
fi
所以这里要注意两件事:

  • 如果
    不接受条件,则接受命令列表
  • 没有提到
    […]
  • 在您的情况下,您希望作为command-list-1:

    ! echo $line | grep error
    
    即:

    if ! $line | grep error;
    then
     mail -s "test3" $Email_Dest < echo $line;
    fi
    
    为什么
    是什么?
    命令列表的返回值是列表中最后一个命令的返回值

    在这里的示例中,只有一个命令,
    !echo$line | grep错误

    当命令是管道时,返回值是管道中最后一个命令的返回值,
    grep
    如果找到某个命令,则返回0,如果没有,则返回1

    但是我们需要相反的条件,所以我们预先设置了
    到管道,它反转管道的返回值,因此如果
    grep
    返回0,它将返回1,从而导致
    if
    跳过
    then
    子句

    那么方括号是怎么回事? 在大多数情况下,您需要测试一个简单的条件,例如文件是否存在,或者变量
    X
    是否大于10。由于shell只接受程序,因此有一个程序执行以下操作:

    • test-f/my/file
      如果文件存在,则返回0;如果文件不存在,则返回1
    • test$X-gt 10
      如果
      X
      的值大于10,则返回0;如果不大于10,则返回1
    您可以按如下方式使用它:

    if test $X -gt 10; then
        ...
    fi
    
    但是人们想让贝壳变得漂亮。因此,他们创建了一个程序,
    /usr/bin/[
    (是!),该程序具有以下语法:
    []
    ,它直接执行
    测试

    这允许您将
    if test$X-gt 10;然后…;fi
    重写为
    if[$X-gt 10];然后…;fi

    那么原始代码是做什么的呢?为什么它从不发送电子邮件? 现在您可以看到,原始代码首先执行
    echo$line | grep error
    ,它要么打印一行,其中包含单词“error”,要么不打印任何内容。然后它捕获此输出,并将其作为参数之一传递给
    [

    如果查看
    [
    (!!!)的手册页,您将看到语法
    [-ne]
    [-ne]
    无效,如果运行它们,您将看到
    [
    打印类似“语法错误”的内容并返回2


    因为
    [
    总是在原始代码中返回2,
    如果
    看到一个非零并跳过
    然后
    子句。

    替换
    替换
    echo$line | grep error`-ne 0`
    替换
    grep-q error“$line”`
    no未工作我的日志文件如下图所示Hanks但未工作我的日志文件如下图所示“欢迎使用sftp>put/some/file/dir/sample\u 13\u 26\u 02.csv上传/some/file/dir/sample\u 07\u 27\u 26\u 02.csv sftp>put/some/file/dir/sample\u 07\u 27\u 13\u 26\u 02.tag sftp>退出星期六11月16日18:10:18 UTC 2019删除文件/some/file/dir/07\u 27\u 13\u 26\u 02.csv星期六删除文件/some/file/dir/u 27\u标签“并且每5分钟跟踪一次作为cron计划,当此日志文件开始每5分钟跟踪/更新一次时,需要捕获grep错误字符串。您指的是两个作业-FTP和监视器。哪一个作业作为重复出现的5分钟cron执行?
    if [ $(uname -s) = Linux ]; then
        USE_GNU=true
    else
        USE_GNU=false
    fi
    ...
    if $USE_GNU; then
        ...
    fi
    
    if test $X -gt 10; then
        ...
    fi