2016-02-25 51 views
0

我是一个系统管理员,我经常有一种情况,我有一个脚本或命令,生成大量的输出,我只想通过电子邮件发送到我如果命令失败。编写一个运行命令的脚本非常容易,收集输出并在命令失败时通过电子邮件发送它,但是我想我应该能够编写一个命令:bash脚本接受登录标准输入和电子邮件日志如果输入过程失败

1)接受stdin上的日志信息 2)等待输入过程退出并查看它的退出状态是否为 3a)如果输入过程干净地退出,将日志输入附加到正常日志文件中(如果输入过程失败),将日志输入附加到正常日志并发送给我一封电子邮件。

它看起来像这样的命令行:

something_important | mailonfail.sh [email protected] /var/log/normal_log 

这将使得它可以很方便的的crontab使用。

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

只是要exatra清楚,这里是我如何与一个包装做到这一点:

#! /bin/bash 

something_important > output 
ERR=$! 

if [ "$ERR" -ne "0" ] ; then 
    cat something_important | mail -s "something_important failed" [email protected] 
fi 
cat something_important >> /var/log/normal_log 

再次声明,这不是我想要的,我想要写一个脚本,并管道命令进去。

这有道理吗?我会怎么做?我错过了什么吗?

谢谢大家! -Dylan

回答

1

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

下面是一些建议:

#!/bin/sh 

TEMPFILE=$(mktemp) 
trap "rm -f $TEMPFILE" EXIT 

if [ ! something_important > $TEMPFILE ]; then 
    mail -s 'something goes oops' -a $TEMPFILE [email protected] 
fi 
cat $TEMPFILE >> /var/log/normal.log 
  • 我不会用bash化这样/ bin/sh的是罚款
  • 创建一个临时文件,以避免使用mktemp(1)
  • 使用trap删除冲突文件当脚本退出时,通常与否
  • 如果命令失败
  • 然后安装文件,该文件会或不会优先于将它嵌入

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

      # 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 
      

+0

你是一个可爱的人,这是一个可爱的答案,但是这是我已经知道如何做的事。无论如何,我给你+1。 – pileofrogs

+0

对不起,我似乎没有完全理解你的问题......是关于如何等待给定时间的一个命令(如果它太慢就杀死它)?我不确定“脚本和管道命令”吗? – bufh

+0

我希望能够执行“./some_command | myscript.sh”并让myscript.sh知道some_command退出是否正常。 – pileofrogs

相关问题