【问题标题】:bash script to accept log on stdin and email log if inputting process fails如果输入过程失败,bash脚本接受标准输入和电子邮件日志的日志
【发布时间】:2016-02-25 20:03:07
【问题描述】:

我是系统管理员,我经常遇到这样的情况,即我的脚本或命令会生成大量输出,我只想在命令失败时通过电子邮件发送给我。编写一个运行命令的脚本非常容易,如果命令失败,收集输出并通过电子邮件发送它,但我想我应该能够编写一个命令

1) 接受标准输入上的日志信息 2)等待输入进程退出,看看它的退出状态是什么 3a) 如果输入过程干净退出,则将日志记录输入附加到普通日志文件 3b) 如果输入过程失败,将日志输入附加到正常日志并发送电子邮件给我。

在命令行上看起来像这样:

something_important | mailonfail.sh me@example.com /var/log/normal_log

这会让它在 crontabs 中非常容易使用。

我无法弄清楚如何让我的脚本等待写入过程并评估该过程如何退出。

为了更加清楚,这是我可以使用包装器的方法:

#! /bin/bash

something_important > output
ERR=$!

if [ "$ERR" -ne "0" ] ; then
  cat something_important | mail -s "something_important failed" me@example.com
fi
cat something_important >> /var/log/normal_log

同样,这不是我想要的,我想写一个脚本并将命令输入其中。

这有意义吗?我该怎么做?我错过了什么吗?

谢谢大家! -迪伦

【问题讨论】:

    标签: bash pipe exit status


    【解决方案1】:

    是的,它确实有道理,而且你很接近。

    以下是一些建议:

    #!/bin/sh
    
    TEMPFILE=$(mktemp)
    trap "rm -f $TEMPFILE" EXIT
    
    if [ ! something_important > $TEMPFILE ]; then
      mail -s 'something goes oops' -a $TEMPFILE you@example.net
    fi
    cat $TEMPFILE >> /var/log/normal.log
    
    • 我不会使用 bashisms 所以 /bin/sh 没问题
    • 使用mktemp(1)创建一个临时文件以避免冲突
    • 使用trap在脚本退出时删除文件,正常与否
    • 如果命令失败
    • 然后附加文件,这将或不会比嵌入它更受欢迎

      • 如果它是一个大文件,你甚至可以压缩它,但附件方法会改变:

        # using mailx
        gzip -c9 $TEMPFILE | uuencode fail.log.gz | mailx -s subject ...
        
        # using mutt
        gzip $TEMPFILE
        mutt -a $TEMPFILE.gz -s ...
        gzip -d $TEMPFILE.gz
        

    等等

    【讨论】:

    • 你是一个可爱的人,这是一个可爱的答案,但我已经知道该怎么做。我还是给你 +1。
    • 很抱歉,我似乎没有完全理解您的问题...是关于如何等待给定时间的命令(如果太慢则杀死它)?我也不确定“脚本和管道命令”?
    • 我希望能够执行 "./some_command | myscript.sh" 并让 myscript.sh 知道 some_command 是否正常退出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2019-03-30
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    相关资源
    最近更新 更多