AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 833170
Accepted
TheStoryCoder
TheStoryCoder
Asked: 2017-02-18 04:02:20 +0800 CST2017-02-18 04:02:20 +0800 CST 2017-02-18 04:02:20 +0800 CST

Cron:仅当输出包含字符串时才发送邮件

  • 772

stderr如果输出( )包含某个字符串,我可以让 cron 仅发送电子邮件吗?

我知道这个答案,但我运行的命令不区分stdout/ stderr,它总是只输出到stdout,所以我需要寻找一个字符串。

到目前为止,我得到了这个,它基本上可以工作,除了 grep 不会将输出传递给 mail 命令,所以我只收到一封空电子邮件:

0 5 * * * root mycommand | grep -q 'Renewal was done' && mail -s 'Renewal completed' [email protected]

如何从电子邮件中包含的 mycommand获取整个输出?

linux email cron grep
  • 3 3 个回答
  • 4922 Views

3 个回答

  • Voted
  1. Best Answer
    iheggie
    2017-02-18T04:43:02+08:002017-02-18T04:43:02+08:00

    我强烈建议您将逻辑放入脚本中并在 cron 中运行该脚本,而不是尝试在 cron 中制作一个单行脚本。这样您就可以轻松地在 cron 之外对其进行测试,例如:

    #!/bin.bash
    tmp=/tmp/t$$
    mycommand > $tmp 
    if grep -q 'Renewal was done' $tmp
    then
        mail -s 'Renewal completed' [email protected] < $tmp
    fi
    
    rm -f $tmp
    exit 0
    

    您可以添加对 mycommand 退出状态的检查、传递正在运行的命令、匹配的字符串以及作为参数的电子邮件地址等。

    • 2
  2. Jeff W.
    2017-02-18T04:27:21+08:002017-02-18T04:27:21+08:00

    这可能会奏效。

    #!/bin/sh
    命令=`我的命令`
    FINDSTR="更新完成"
    
    答案 = `$COMMAND | grep $FINDSTR`
    
    如果 $ANSWER; 然后
      echo $ANSWER > mail -s '续订完成' [email protected]
    菲
    
    • 1
  3. Louis Papaloizou
    2017-02-22T15:51:11+08:002017-02-22T15:51:11+08:00

    这是我的做法:

    在这种情况下,我需要备份 4 个数据库(转储),如果一切正常,我希望收到一封提及此事的电子邮件。如果我有错误,我想要一条带有不同主题的消息来指出它,消息正文中包含失败的数据库以及附加到电子邮件的错误日志。

    第一个文件(/root/templates/ylatis-backup.txt)只是一个消息正文模板:

    备份状态报告来自:%hostname

    网络配置:
    %net_config

    数据库备份:
    ylatis-cy :%cy_status
    ylatis-ug :%ug_status
    ylatis-rw :%rw_status
    ylatis-lc :%lc_status

    所有以 % 为前缀的单词都被视为变量,稍后在脚本中被 sed 替换。
    %hostname 和 %net_config 用于识别电子邮件来自哪台计算机。
    以 _status 结尾的变量被替换为 NORMAL 或 ERROR,这样我就可以知道出了什么问题。

    #!/bin/bash
    
    NET_CONFIG=$(ifconfig |grep inet |grep -v inet6 |grep -v '127.0.0.1')
    MESSAGE_TEMPLATE=/root/templates/ylatis-backup.txt
    REPORT_FILE=/tmp/bkup-report-$$.txt
    MESSAGE=$(cat $MESSAGE_TEMPLATE)
    
    MAIL_FROM='[email protected]'
    MAIL_TO='[email protected]'
    MAIL_SUBJECT="[$HOSTNAME] [Backup Report: Databases] %status  [$(date +%Y-%m-%d)]"
    MAIL_SERVER='smtp.gmail.com:587'
    MAIL_USER='[email protected]'
    MAIL_PASS='**********'
    
    CY_ERR=/tmp/ylatis-cy_err.$$
    UG_ERR=/tmp/ylatis-ug_err.$$
    RW_ERR=/tmp/ylatis-rw_err.$$
    LC_ERR=/tmp/ylatis-lc_err.$$
    
    ERROR_LOG=/tmp/error_log-$$.txt
    
    MESSAGE=$(echo "$MESSAGE" |sed 's@%hostname@'"$HOSTNAME"'@g')
    MESSAGE=$(echo "$MESSAGE" |sed 's@%net_config@'"$NET_CONFIG"'@g')
    
    mount -a
    rsync -azv --chown root:root [email protected]::backup/ /mnt/hdd3/ylatis-cy/ 1>/dev/null 2>$CY_ERR
    cy_status=$?
    rsync -azv --chown root:root [email protected]::ylatisug/ /mnt/hdd3/ylatis-ug/ 1>/dev/null 2>$UG_ERR
    ug_status=$?
    rsync -azv --chown root:root [email protected]::ylatisrw/ /mnt/hdd3/ylatis-rw/ 1>/dev/null 2>$RW_ERR
    rw_status=$?
    rsync -azv --chown root:root [email protected]::labco/ /mnt/hdd3/ylatis-labco/ 1>/dev/null 2>$LC_ERR
    lc_status=$?
    
    if [ $cy_status -eq 0 ] && [ $ug_status -eq 0 ] && [ $rw_status -eq 0 ] && [ $lc_status -eq 0 ]; then
    ##########
    #ALL GOOD#
    ##########
    
    MAIL_SUBJECT=$(echo "$MAIL_SUBJECT" |sed 's@%status@[NORMAL]@g')
    
    MESSAGE=$(echo "$MESSAGE" |sed 's@%cy_status@NORMAL@g')
    MESSAGE=$(echo "$MESSAGE" |sed 's@%ug_status@NORMAL@g')
    MESSAGE=$(echo "$MESSAGE" |sed 's@%rw_status@NORMAL@g')
    MESSAGE=$(echo "$MESSAGE" |sed 's@%lc_status@NORMAL@g')
    
    echo "$MESSAGE" >$REPORT_FILE
    sendemail -f $MAIL_FROM -t $MAIL_TO -u $MAIL_SUBJECT -o message-      file=$REPORT_FILE -s $MAIL_SERVER -xu $MAIL_USER -xp $MAIL_PASS
    
    else
    ################
    #ERRORS OCCURED#
    ################
    
    MAIL_SUBJECT=$(echo "$MAIL_SUBJECT" |sed 's@%status@[ERROR]@g')
    
    if [ $cy_status -eq 0 ]; then
      MESSAGE=$(echo "$MESSAGE" |sed 's@%cy_status@NORMAL@g')
    else
      MESSAGE=$(echo "$MESSAGE" |sed 's@%cy_status@ERROR@g')
    fi
    
    if [ $ug_status -eq 0 ]; then
      MESSAGE=$(echo "$MESSAGE" |sed 's@%ug_status@NORMAL@g')
    else
      MESSAGE=$(echo "$MESSAGE" |sed 's@%ug_status@ERROR@g')
    fi
    
    if [ $rw_status -eq 0 ]; then
      MESSAGE=$(echo "$MESSAGE" |sed 's@%rw_status@NORMAL@g')
    else
      MESSAGE=$(echo "$MESSAGE" |sed 's@%rw_status@ERROR@g')
    fi
    
    if [ $lc_status -eq 0 ]; then
      MESSAGE=$(echo "$MESSAGE" |sed 's@%lc_status@NORMAL@g')
    else
      MESSAGE=$(echo "$MESSAGE" |sed 's@%lc_status@ERROR@g')
    fi
    
      echo "$MESSAGE" >$REPORT_FILE
    
      cat /dev/null >$ERROR_LOG
      find /tmp/ -name \*.$$ -exec cat {} \; >>$ERROR_LOG
      cp $ERROR_LOG .
      sendemail -f $MAIL_FROM -t $MAIL_TO -u $MAIL_SUBJECT -o message-file=$REPORT_FILE -a error_log-$$.txt -s $MAIL_SERVER -xu $MAIL_USER -xp  $MAIL_PASS
      rm error_log-$$.txt
    
    fi
    
    #Cleanup
    rm /tmp/*.$$ 2>/dev/null
    rm /tmp/*$$.txt 2>/dev/null
    

    请注意我如何监视 rsync 的退出状态以确定我的电子邮件的消息和主题应该是什么。在我的情况下,我丢弃了正常输出(1>/dev/null)并只保留标准错误输出(2>$error_log)。如果要保留所有输出,可以只使用 >> 运算符。如果您正在从终端阅读邮件,您还可以调整以在消息中包含日志而不是附件,以方便使用。

    也许对于一个相对简单的问题来说,这看起来有点矫枉过正,但我​​认为它很好地概述了你正在尝试做的事情。您需要在通过中间脚本运行命令时构建消息并稍后发送。如果您发现上面的代码有用并且有任何问题,请随时在评论中提问。

    • 0

相关问题

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • Exchange 2007 的备份解决方案

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve